2015-04-07 4 views
2

У меня есть два списка, и я хочу использовать itertool.zip_longest, чтобы сравнить некоторые значения в списке и сделать что-то еще, это код, который я написал до сих порКак получить значение во вложенном списке, используя itertools.zip_longest

import itertools 

List1 = [['a'],['B']] 
List2 = ['A','b','C'] 

for a in List1: 
    for i in itertools.zip_longest(a,List2): 
     print (i) 

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

('a', 'A') 
(None, 'b') 
(None, 'C') 
('B', 'A') 
(None, 'b') 
(None, 'C') 

Я пытаюсь получить что-то вроде этого

('a', 'A') 
('B', 'b') 
(None, 'C') 

так что я могу сравнить значения непосредственно

+0

Это не ясно, почему вы ожидаете второй выход. Если вы этого хотите, 'List1' должен выглядеть как' ['a', 'B'] '- возможно, сначала сгладить? – jonrsharpe

+0

извините, я все еще новичок в python, я думаю, что пытался сгладить (т. Е. Получить значения в списке) сначала с первым для цикла – danidee

ответ

1

Вы можете использовать выражение генератора выравниваться list1:

List1 = [['a'],['B']] 
List2 = ['A','b','C'] 

print(list(itertools.zip_longest((b for a in List1 for b in a),List2)) 
[('a', 'A'), ('B', 'b'), (None, 'C')] 

Если вы хотите сравнить только перебрать zip_longest объекта распаковке:

for a, b in itertools.zip_longest((b for a in List1 for b in a),List2): 
    if a == b: 
     # do whatever 

Для установки конкретного значения используются Defualt fillvalue:

List1 = [['a'],['B']] 
List2 = ['A','b','C'] 

print(list(itertools.zip_longest((b for a in List1 for b in a),List2,fillvalue="foo"))) 
[('a', 'A'), ('B', 'b'), ('foo', 'C')] 
+0

как я могу удалить None в третьем кортеже или еще лучше установить значение по умолчанию для него – danidee

+0

@danidee, указать 'fillvalue = whatever' в zip_longest –

1

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

>>> list(itertools.izip_longest(itertools.chain(*List1),List2)) 
[('a', 'A'), ('B', 'b'), (None, 'C')] 
+0

Спасибо за быстрый ответ, но я думаю, мне нужно будет сгладить список1 чтобы получить ['a', 'B'], поэтому я могу сравнить это: если List1 [0] в List2: do_something() или есть какой-либо способ, я могу сравнить значения – danidee

+0

'itertools.chain (* List1)' flattens список для вас. – AChampion

+0

@ danidee добро пожаловать! Поскольку achampio говорит, что 'itertools.chain (* List1)' выравнивает список! – Kasramvd