2017-01-11 11 views
0

Я 2 идентичных списков, как показано ниже:Соединить элементы идентичных списков без дубликатов питона

list_1 = ['A','B','C','D','E','F'] 
list_2 = ['A','B','C','D','E','F'] 

Я сцепить каждый элемент в них,

for i in list_1: 
    for j in list_2: 
     print(i+' and '+j) 

Можете ли вы помочь мне удалить повторяющиеся комбинации, может произойти? (Например: AA, .. FF, а также AB, AC, BC и т. д.)

Заранее спасибо!

+1

Это случай проблемы XY. Вам не нужны два одинаковых списка, только один список и 'iterations.combinations'. –

+0

Вы также хотите CA, CB и т. Д.? –

+0

Right @JoelCornett Фактический код состоит только из одного списка, и это случай комбинаций. Это быстрый пример, который я придумал, пропустил мой разум;) – Sailesh

ответ

2

Вы просто выполнить сравнение и ограничения его для того чтобы i будучи менее j:

for i in list_1: 
    for j in list_2: 
     if i < j: 
      print(i+' and '+j) 

Из-за ограничения заказа, если 'A and B' печатается, это означает, что A меньше B, так что это означает ограничение 'A' > 'B' не удастся, и поэтому B and A не будет напечатан.

+1

'i' и' j' не являются целыми числами !!! Это списки персонажей. –

+2

@barakmanos: порядок также определяется на объектах 'str': здесь используется лексикографический порядок. Пока '<' является математическим не рефлексивным отношением порядка (будучи нерефлексивным, транзитивным и ассиметричным), это будет работать. –

+0

ОК, вы правы! –

2

itertools.combinations. В этом случае код становится намного проще. Вам нужен только один список, combinations автоматически генерирует только уникальные комбинации. Поэтому вам не нужно фильтровать «AA» или «CB», проходящий только «BC».

>>> from itertools import combinations 

>>> l=['A','B','C','D','E','F'] 

list(combinations(l, 2)) 
[('A', 'B'), ('A', 'C'), ('A', 'D'), ('A', 'E'), ('A', 'F'), 
('B', 'C'), ('B', 'D'), ('B', 'E'), ('B', 'F'), 
('C', 'D'), ('C', 'E'), ('C', 'F'), 
('D', 'E'), ('D', 'F'), 
('E', 'F')] 

>>> # or with joined strings 
>>> [' and '.join(x) for x in combinations(l, 2)] 
['A and B', 'A and C', 'A and D', 'A and E', 'A and F', 
'B and C', 'B and D', 'B and E', 'B and F', 
'C and D', 'C and E', 'C and F', 
'D and E', 'D and F', 
'E and F'] 

Я отформатировал вывод, чтобы увидеть, что у вас чистый результат.