2012-05-07 6 views
0

мне нужно активизировать некоторые элементы из списка (в данном случае п) я также другой список (о списке)сортировочные элементы из списка

n=['A','B','C','D','E'] 
o=['A','B','C','D','E','AS','sd','Z','R'] 
n.sort() 

Теперь, если я использую этот код:

for o in sorted(n): 

Код для заказа 'A','B','C','D','E'.

Мне нужно запустить код для кода, но только 'AS','sd','Z','R' элементов.

Что-то вроде: запустить код для элементов из списка O без элементов из п списка

+1

Помните, что итерация 'for o в отсортированном (n)' будет переписывать содержимое списка 'o'. – moooeeeep

ответ

6

Это работает только если o не имеет дубликатов:

n = ['A','B','C','D','E'] 
o = ['A','B','C','D','E','AS','sd','Z','R'] 
a = sorted(set(o) - set(n)) 

# a == ['AS', 'R', 'Z', 'sd'] 

иначе использовать это:

n = ['A','B','C','D','E'] 
o = ['A','B','C','D','E','AS','sd','Z','R', 'AS'] 
s = set(n) 
a = sorted(elem for elem in o if elem not in s) 

# a == ['AS', 'AS', 'R', 'Z', 'sd'] 
+2

Помните, что ваше условие if создает новую 'set' на каждой итерации. – jamylak

+2

лучше вычислить 'set (n)' вне цикла –

0

Комплект имеет такие операции.

n=['A','B','C','D','E'] 
o=['A','B','C','D','E','AS','sd','Z','R'] 

for ab in set(o).difference(set(n)): 
    print ab 
+0

Добавьте 'sorted()' invocation, и это будет идеально. –

+0

Это было бы не идеально, потому что 'sets' не хранит дубликаты. – jamylak

1

Я предлагаю использовать list comprehension для фильтрации и сортировки() для сортировки:

for item in sorted(element for element in n if element not in o): 
    print item 

Если n имеет тенденцию быть большим, это будет быстрее, чтобы создать набор первых:

forbidden = set(o) 
for item in sorted(element for element in n if element not in forbidden): 
    print item 

EDIT: добавлен набор и использует выражение генератора вместо этого, как предложено в комментариях.

+1

Только нижняя сторона этого - производительность - итерация через o (а не создание набора изначально и выполнение поиска по набору) не так быстро. –

+0

вы можете оставить '[]'. 'sorted' отлично работает с генераторным выражением –

0
n = ['A','B','C','D','E'] 
o = ['A','B','C','D','E','AS','sd','Z','R'] 
result = sorted(set(o) - set(n)) 
+2

наборы не заказываются –

+0

Множества @gnibbler упорядочены, но это не порядок включения. – moooeeeep

+0

@moooeeeep, я поднимаю вам ссылку http://docs.python.org/library/stdtypes.html#set-types-set-frozenset «Установленный объект представляет собой неупорядоченный набор различных хешируемых объектов». –

Смежные вопросы