Python, краткий способ проверить членство в коллекции, используя частичное совпадение - PullRequest
4 голосов
/ 23 апреля 2010

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

, например:

c = ((0,1),(2,3))
# (0,) should match first element, (3,)should match no element

Я должен добавить свой питон 2,4 и / или 2,5

спасибо

Ответы [ 3 ]

3 голосов
/ 23 апреля 2010

Edit: Спасибо ОП за дополнительное объяснение проблемы.
Понятия вложенного списка С.Марка довольно злые; проверь их.

Я мог бы использовать вспомогательную функцию:

def tup_cmp(mytup, mytups):
    return any(x for x in mytups if mytup == x[:len(mytup)])

>>> c = ((0, 1, 2, 3), (2, 3, 4, 5))
>>> tup_cmp((0,2),c)
False
>>> tup_cmp((0,1),c)
True
>>> tup_cmp((0,1,2,3),c)
True
>>> tup_cmp((0,1,2),c)
True
>>> tup_cmp((2,3,),c)
True
>>> tup_cmp((2,4,),c)
False

Оригинальный ответ:
Работает ли у вас список-понимание для вас?:

c = ((0,1),(2,3))

[i for i in c if i[0] == 0]
# result: [(0, 1)]

[i for i in c if i[0] == 3]
# result: []

Список работ был введен в 2.0 .

2 голосов
/ 23 апреля 2010
>>> c = ((0,1),(2,3))
>>> [x for x in c if all(1 if len(set(y)) is 1 else 0 for y in zip((0,),x))]
[(0, 1)]
>>> [x for x in c if all(1 if len(set(y)) is 1 else 0 for y in zip((0,1),x))]
[(0, 1)]
>>> [x for x in c if all(1 if len(set(y)) is 1 else 0 for y in zip((2,),x))]
[(2, 3)]
>>> [x for x in c if all(1 if len(set(y)) is 1 else 0 for y in zip((2,3),x))]
[(2, 3)]
>>> [x for x in c if all(1 if len(set(y)) is 1 else 0 for y in zip((4,),x))]
[]

С большим кортежем

>>> c=((0,1,2,3),(2,3,4,5))
>>> [x for x in c if all(1 if len(set(y)) is 1 else 0 for y in zip((0,1),x))]
[(0, 1, 2, 3)]
>>> [x for x in c if all(1 if len(set(y)) is 1 else 0 for y in zip((0,2),x))]
[]
>>> [x for x in c if all(1 if len(set(y)) is 1 else 0 for y in zip((2,),x))]
[(2, 3, 4, 5)]
>>> [x for x in c if all(1 if len(set(y)) is 1 else 0 for y in zip((2,3,4),x))]
[(2, 3, 4, 5)]
>>> [x for x in c if all(1 if len(set(y)) is 1 else 0 for y in zip((4,),x))]
[]
>>>

Редактировать : более компактным будет

>>> [x for x in c if all(len(set(y))==1 for y in zip((0,),x))]
[(0, 1, 2, 3)]
1 голос
/ 23 апреля 2010

мое собственное решение, комбинация двух других ответов

f = lambda c, t: [x for x in c if t == x[:len(t)]]
...