2014-12-19 3 views
3

У меня есть список, как показано ниже:Python: Сравните список и список кортежей

z = [('Anna Smith', 'IN1'), ('John', 'IN2'), ('Matt Andrew', 'IN3'), ('Smith', 'IN4')] 

И еще один список:

c = ['Anna Smith', 'John', 'Anna', 'Smith'] 

Я хочу ниже вывод:

o = ['Anna Smith|IN1', 'John|IN2', 'Smith|IN4'] 

Я пробовал приведенный ниже код:

for s, s_inc in z: 
    for word in c: 
      if word.lower() in s.lower(): 
       o.append("%s|%s"%(word, s_inc)) 

Но выше дает мне выход:

o = ['Anna Smith|IN1', 'Anna|IN1', 'Smith|IN1', 'John|IN2', 'Smith|IN4'] 

Как получить то, что я хочу?

+0

Почему вы используете проверку принадлежности строчной, когда вы, кажется, хотят т est для * целых * матчей. –

+0

Кроме того, вам кажется, что требуется равенство, а не проверка - если слово == s является соответствующим условным – GoingTharn

+0

, используйте понимание списка: '['|' .join ((i, t)) для i в c для k, t в z, если k == i] ['Anna Smith | IN1', 'John | IN2', 'Smith | IN4'] ' – Kasramvd

ответ

0

Из ваших примеров, кажется, вы ищете точное соответствие, так что просто использовать == вместо in:

for s, s_inc in z: 
    for word in c: 
      if word == s: 
       o.append("%s|%s"%(word, s_inc)) 

или короче, как единый список понимание:

o = ["%s|%s"%(s, s_inc) for s, s_inc in z if s in c] 

После этого o является ['Anna Smith|IN1', 'John|IN2', 'Smith|IN4']

0

Tr у этого:

z = [('Anna Smith', 'IN1'), ('John', 'IN2'), ('Matt Andrew', 'IN3'), ('Smith', 'IN4')] 
c = set(['Anna Smith', 'John', 'Anna', 'Smith']) 

o = [ 
    '|'.join([name, code]) for name, code in z if name in c 
] 
0

Я бы сделал cнабор, для быстрого тестирования постоянного времени:

c_set = {w.lower() for w in c} 

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

Затем просто использовать:

for s, s_inc in z: 
    if s.lower() in c_set: 
     o.append('|'.join([s, s_inc])) 

или даже:

o = ['|'.join([s, s_inc]) for s, s_inc in z if s.lower() in c_set] 

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

Демо:

>>> z = [('Anna Smith', 'IN1'), ('John', 'IN2'), ('Matt Andrew', 'IN3'), ('Smith', 'IN4')] 
>>> c = ['Anna Smith', 'John', 'Anna', 'Smith'] 
>>> c_set = {w.lower() for w in c} 
>>> ['|'.join([s, s_inc]) for s, s_inc in z if s.lower() in c_set] 
['Anna Smith|IN1', 'John|IN2', 'Smith|IN4'] 
0
>>> z = [('Anna Smith', 'IN1'), ('John', 'IN2'), ('Matt Andrew', 'IN3'), ('Smith', 'IN4')] 
>>> c = ['Anna Smith', 'John', 'Anna', 'Smith'] 
>>> ['|'.join([i,x[1]]) for x in z for i in c if x[0]==i] 
['Anna Smith|IN1', 'John|IN2', 'Smith|IN4'] 
2

Список постижение элегантный способ для этого типа фильтрации/список задач манипуляции.

Понимание состоит из трех частей:

-Первый в результате строится в а + «|» + Ь

-Во-вторых, а и б назначены первого и второго элемента в каждой 2 -кратный в списке г

-Thirdly процеживает при условии, что должно быть членом списка с

print [a+'|'+b for a,b in z if a in c] 

# Prints ['Anna Smith|IN1', 'John|IN2', 'Smith|IN4'] 
+0

Некоторое (краткое) объяснение того, как это работает и что именно оно может сделать ответ более полезным. – ssube

+0

Точка снята. Пояснение добавлено. – Moose

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