Sortieren anhand von Liste

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
nemomuk
User
Beiträge: 862
Registriert: Dienstag 6. November 2007, 21:49

Hallo,

gibt es für so etwas hier auch etwas vorgefertigtes? (die Elemente einer Liste sollen gemäß der Reihenfolge einer anderen Liste sortiert werden)

Code: Alles auswählen

# coding: utf-8

a = [
    'motorway',
    'motorway_link',
    'trunk',
    'trunk_link',
    'primary',
    'primary_link',
    'secondary',
    'secondary_link',
    'tertiary',
    'unclassified',
    'road',
    'residential',
    'living_street',
    'service',
    'track',
    'pedestrian',
    'raceway',
    'services',
    'bus_guideway',
    'path',
    'cycleway',
    'footway',
    'bridleway',
    'steps',
    'river',
    'stream',
]

def sort_list_cmp(sort_list):
    def sort(x, y):
        return sort_list.index(x) - sort_list.index(y)
    return sort

l = ['motorway', 'path', 'trunk', 'river', 'motorway_link', 'track']
print sorted(l, cmp=sort_list_cmp(a))
Vielen Dank im voraus!
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Code: Alles auswählen

print sorted(l,key=a.index)
nemomuk
User
Beiträge: 862
Registriert: Dienstag 6. November 2007, 21:49

Danke, ich hatte allerdings vergessen zu erwähnen, dass ich das key-Argument anderweitig benötige...

Code: Alles auswählen

# coding: utf-8
from operator import attrgetter

a = [
    'motorway',
    'motorway_link',
    'trunk',
    'trunk_link',
    'primary',
    'primary_link',
    'secondary',
    'secondary_link',
    'tertiary',
    'unclassified',
    'road',
    'residential',
    'living_street',
    'service',
    'track',
    'pedestrian',
    'raceway',
    'services',
    'bus_guideway',
    'path',
    'cycleway',
    'footway',
    'bridleway',
    'steps',
    'river',
    'stream',
]

class Test(object):
    
    def __init__(self, name):
        self.name = name
        
    def __repr__(self):
        return self.name

def sort_list_cmp(sort_list):
    def sort(x, y):
        return sort_list.index(x) - sort_list.index(y)
    return sort

l = [Test('motorway'), Test('path'), Test('trunk'), Test('river'), Test('motorway_link'), Test('track')]
print sorted(l, cmp=sort_list_cmp(a), key=attrgetter('name'))
nemomuk
User
Beiträge: 862
Registriert: Dienstag 6. November 2007, 21:49

Code: Alles auswählen

print sorted(l, key=lambda x: a.index(x.name))
Antworten