首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >列表理解筛选列表列表

列表理解筛选列表列表
EN

Stack Overflow用户
提问于 2022-11-29 09:40:52
回答 6查看 38关注 0票数 0

这个问题来自https://leetcode.com/problems/find-players-with-zero-or-one-losses/。是否可以在此问题中使用列表理解来创建一个新列表,该列表中每个元组的第一项都不会出现在任何元组的第二项中。

例如:

matches = [[1,3],[2,3],[3,6],[5,6],[5,7],[4,5],[4,8],[4,9],[10,4],[10,9]]

我想要一份新的清单:

neverLost = [1, 2, 10]

我会列出两份清单,一份为问题的每一部分加上清单理解,然后把它们连在一起,以求解决问题。我试过使用列表理解,但我有语法问题

neverLost = [w for w, l in matches if w not l]

第一部分w表示w,l在匹配中很好,并将创建每个元组[1, 2, 3, 5, 5, 4, 4, 4, 10, 10]的第一个项目的列表,但是我很难理解表达式的语法和理解,以筛选“胜利者”。如果这是解决这个问题的好办法,请告诉我。我知道我可以用字典来做这件事,但我想知道这种方法是否也是可能的。谢谢!

EN

回答 6

Stack Overflow用户

发布于 2022-11-29 09:46:31

列表理解是有效的,但没有优化的方法来解决这些问题。

代码语言:javascript
复制
In [48]: list(set([j[0] for j in matches if j[0] not in [i[1] for i in matches]]))
Out[48]: [1, 2, 10]
票数 2
EN

Stack Overflow用户

发布于 2022-11-29 09:51:09

你所做的

代码语言:javascript
复制
neverLost = [w for w, l in matches if w not l]

将检查该元组中的第一项是否等于该元组中的第二项。它是而不是检查第一项是否在任何其他元组中位于第二位。

你可以用这个-

代码语言:javascript
复制
list(set([w[0] for w in matches if w[0] not in [l[1] for l in matches]]))
票数 1
EN

Stack Overflow用户

发布于 2022-11-29 09:56:42

我觉得你应该做点什么,

代码语言:javascript
复制
matches = [[1, 3], [2, 3], [3, 6], [5, 6], [5, 7], [4, 5], [4, 8], [4, 9], [10, 4], [10, 9]]

losses_dict = {}
for (_, value) in matches:
    losses_dict.setdefault(value, 0)  # key might exist already
    losses_dict[value] += 1

final_list = [
              [k for k, _ in matches if k not in losses_dict.keys()],
              [k for k, v in losses_dict.items() if v == 1]
             ]

dict.setdefault检查该键是否已经存在,否则它会追加值0。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74611917

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档