Python, удаляя весь список, если он содержит соответствующий кортеж - PullRequest
1 голос
/ 22 марта 2011

Надеюсь, об этом раньше не спрашивали, но мне сложно выразить словами, что я пытаюсь сделать!

Может быть проще, если я объясню свой ввод и желаемый вывод

l1 = [[(14, 'h'), (14, 'd')], [(14, 'h'), (14, 'c')], [(14, 'h'), (14, 's')], [(14, 'd'), (14, 'c')], [(14, 'd'), (14, 's')], [(14, 'c'), (14, 's')], [(13, 'h'), (13, 'd')], [(13, 'h'), (13, 'c')], [(13, 'h'), (13, 's')], [(13, 'd'), (13,'c')], [(13, 'd'), (13, 's')], [(13, 'c'), (13, 's')], [(12, 'h'), (12, 'd')], [(12, 'h'), (12, 'c')], [(12, 'h'), (12, 's')], [(12, 'd'), (12, 'c')], [(12, 'd'), (12, 's')], [(12, 'c'), (12, 's')]]

l2 = [(13,'h'),(13,'d'),(14,'c'),(14,'s'),(14,'h')]

Итак, этот первый список, l1, представляет собой список списков, каждый список представляет собой покерную комбинацию из 2 карт.

По сути, я пытаюсь сделать так, если карта в l2, руку в l1 нужно убрать. Таким образом, запись [(14, 'd'), (14, 'c')] должна быть удалена из l1, потому что (14, 'c') находится в l2 - даже если (14, 'd') isn ' т в l2.

Желаемый результат из этого примера должен быть,

[[(13, 'c'), (13, 's')], [(12, 'h'), (12, 'd')], [(12, 'h'), (12, 'c')], [(12, 'h'), (12, 's')], [(12, 'd'), (12, 'c')], [(12, 'd'), (12, 's')], [(12, 'c'), (12, 's')]]

Я думал об итерации по всем кортежам в l1 и их удалении, если они находятся в l2, затем вернусь назад и переберем списки в l1 и удалим все без len == 2. Это не похоже на лучший путь, хотя.

Есть мысли?

ManyTIA!

Ответы [ 3 ]

5 голосов
/ 22 марта 2011
l2_set = set(l2)
# or use 
#   l2_set = {(13,'h'),(13,'d'),(14,'c'),(14,'s'),(14,'h')}
# directly

l1 = [hand for hand in l1 if not (hand[0] in l2_set or hand[1] in l2_set)]

Если запись может содержать ≥2 членов, вы можете обобщить условие фильтра на

l1 = [hand for hand in l1 if all(subhand not in l2_set for subhand in hand)]
1 голос
/ 22 марта 2011
[x for x in l1 if not any(y in l2 for y in x)]
0 голосов
/ 22 марта 2011
    >>> [x for x in l1 if not set(x).intersection(l2)]
[[(13, 'c'), (13, 's')], [(12, 'h'), (12, 'd')], [(12, 'h'), (12, 'c')], [(12, 'h'), (12, 's')], [(12, 'd'), (12, 'c')], [(12, 'd'), (12, 's')], [(12, 'c'), (12, 's')]]
...