2013-07-03 3 views
1

У меня есть список из ста или около строк и каждая строка сравниваются друг с другом в 2 для петель, здесь очень простой обзор коды:Как избежать сравнений повторяющихся строк в списке

string_list = ["PII", "AZO", "CVCO", "MOD"] 

for x in string_list: 
    for y in string_list: 
     if x != y: 
      print (x, y) 

который печатает:

PII AZO 
PII CVCO 
PII MOD 
AZO PII 
AZO CVCO 
AZO MOD 
CVCO PII 
CVCO AZO 
CVCO MOD 
MOD PII 
MOD AZO 
MOD CVCO 

как вы можете видеть, много строк сравниваются два раза (PII - AZO и AZO - PII и т.д.)

Я пытался выяснить, как избежать этой проблемы usin g 2 count, но я царапаю свою голову, должен быть более простой/pythonic способ сделать это, чтобы не было совпадающих сравнений строк, кто-нибудь знает, как это сделать?

Python 3, спасибо.

EDIT:

Ожидаемый результат:

PII AZO 
PII CVCO 
PII MOD 
AZO CVCO 
AZO MOD 
CVCO MOD 
+0

Каков ожидаемый результат? –

ответ

10

Использование itertools.combinations():

>>> string_list = ["PII", "AZO", "CVCO", "MOD"] 
>>> from itertools import combinations 
>>> for a, b in combinations(string_list, 2): 
...  print(a, b) 
... 
PII AZO 
PII CVCO 
PII MOD 
AZO CVCO 
AZO MOD 
CVCO MOD 

Ваша версия генерируется permutations вместо этого.

+1

Просто помните, что комбинации будут генерировать генератор, и вы можете только пропустить генератор один раз. Если вам нужны комбо несколько раз, используйте что-то вроде combos = list (комбинаций (string_list, 2)) – rtrwalker

+0

Незначительный nitpick: версия OP не эквивалентна 'itertools.permutations()'. Если список содержит повторяющиеся элементы, первый не будет генерировать никаких результатов (x, x), а последний будет. –

2

, как вы могли бы сделать это вручную является итерация второго списка, начиная после индекса первого списка:

import itertools 

for i, x in enumerate(string_list): 
    for y in itertools.islice(string_list, i + 1, None) 
     # if you don't have duplicates, this next check isn't necessary 
     if x != y: 
      print(x, y) 

itertools.islice(list, start, stop), как list[start:stop], но не делает копию. Спасибо комментаторам, которые указали это.

+1

'itertools.islice (string_list, i, None)'. –

+0

'itertools.islice()' позволит вам избежать копирования. :-) –

+0

Спасибо за объяснение, как это работает, я выбираю другой ответ только из простоты. – Goose

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