【问题标题】:Check if list contains element different from something [duplicate]检查列表是否包含与某些东西不同的元素[重复]
【发布时间】:2021-07-27 14:51:17
【问题描述】:

有没有一种有效的方法来检查一个列表是否包含一个与其他元素不同的元素?

我有很多类似的列表:

a = ["_", "_", "_", "_"]
b = ["_", "b", "_", "_"]
c = ["a", "_", "x", "_"]

它们大多是下划线,但有时有一个元素不是下划线。我只想处理那些有“内容”的人。目前,我使用 for 循环检查是否存在非下划线元素。 有没有更有效的方法?

【问题讨论】:

  • 需要某种循环。你做了什么处理,得到的数据结构是什么?
  • 我正在循环浏览一个 NLP 数据集,在特定列中搜索语义角色。它们中的大多数不是,因此所有这些列都是空的。另外,列的数量是一个句子中动词的数量,所以我也不能确定元素的数量。我想也许值得数一下有多少下划线,如果它与长度不同,它必须包含一些东西?

标签: python python-3.x list


【解决方案1】:

使用 zip 遍历列表中的每个项目,使用集合查找唯一项目并找到该集合的长度

a = ["_", "_", "_", "_"]
b = ["_", "b", "_", "_"]
c = ["a", "_", "x", "_"]

has_value = [len(set(col))>1 for col in zip(a, b, c)]

输出:

True
True
True
False

【讨论】:

  • 也谢谢你的回答,它也很好用
【解决方案2】:

对于裸布尔检查,您可以像这样使用mapany

for lst in (a, b, c):
    print(any(map("_".__ne__, lst)))
# False
# True
# True

或者更明确一点:

any(x != "_" for x in lst)

与您建议的设置长度方法相比,any 具有短路(在第一次命中时停止)的优势:

len(set(lst)) > 1

这是否使它在现实世界中更快取决于您的数据。如果您的大多数列表只是下划线并因此对其进行整体迭代,那么集合转换(C 优化)可能会更快。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-05-11
    • 1970-01-01
    • 2012-06-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多