2012-02-16 5 views
0

Если у меня есть:Проверка на наличие строки в списке кортежей

my_list = (('foo', 'bar'), ('floo', 'blar')) 

как я могу легко проверить, если некоторые строки в первом элементе в любом из этих кортежей?

что-то вроде:

if 'foo' in my_list 

, где мы просто проверяем первый элемент каждого кортежа в списке?

+0

К «некоторые строки в первом элементе», вы имеете в виду, что «Foo» является подстрока из первых элемент или что первый элемент равен «foo»? – DSM

ответ

2

Если вы хотите проверить только против первого элемента в каждом кортеже:

if 'foo' in (item[0] for item in my_list) 

В качестве альтернативы:

if any('foo' == item[0] for item in my_list) 
0
if 'foo' in map(lambda x: x[0], my_list): 
    <do something> 

map принимает каждый элемент в списке, применяет функцию к нему , и возвращает список результатов. В этом случае функция является лямбда-функцией, которая возвращает первый подэлемент исходного элемента.

((0,1),(3,4)) становится (0,3).

1

Используйте батареи:

if 'foo' in itertools.imap(operator.itemgetter(0), my_list): 

Это не создаст копию вашего кортежа (это на самом деле кортеж, а не список) и должен быть самым быстрым.

+0

Я использовал 'timeit', чтобы посмотреть, насколько быстро у вас есть по сравнению с моим, а мой - около 121 мс быстрее. ;) (0,7894101142883301 против 0,9111800193786621): P http://pastie.org/3397302 – Gandaro

+0

Сроки не имеют смысла для такого небольшого примера. ''foo' in (my_list [0] [0], my_list [1] [0])' is * much * быстрее. И еще быстрее - '' foo '== my_list [0] [0] или' foo '== my_list [1] [0] '. – WolframH

3

Прежде всего, my_list - это кортеж, а не список.

>>> my_list = (('foo', 'bar'), ('floo', 'blar')) 
>>> 'foo' in zip(*my_list)[0] 
True 

Вы можете также использовать itertools, если вы предпочитаете:

>>> from itertools import izip 
>>> 'foo' in next(izip(*my_list)) 
True 
0
my_list = iter(my_list) 

result = False 

while True: 
    try: 
     x, y = my_list.next() 
     if x == 'foo': 
      result = True 
      break 
    except StopIteration: 
     break 
Смежные вопросы