【问题标题】:List comprehension with list and list of tuples使用列表和元组列表进行列表理解
【发布时间】:2016-12-12 12:18:06
【问题描述】:

在我的 Python 2.7.5 代码中,我有以下数据结构:

一个简单的列表...

>>> data["parts"]
['com', 'google', 'www']

...和一个元组列表...

>>> data["glue"]
[(1L, 'com'), (3L, 'google')]

当输入存在这些结构的代码时,我将始终知道data["parts"] 中的内容; data["glue"] 充其量将包含与 data["parts"] 中的内容“匹配”的元组 - 最坏的情况 data["glue"] 可以为空。我需要知道的是胶水缺少的部分。因此,对于上面的示例数据,我需要知道缺少“www”,这意味着它不在data["glue"] 中可能存在的任何元组中。

我首先尝试通过各种 for 循环加上 if 语句来生成缺失部分的列表,但它充其量是非常混乱的。我尝试过列表推导但失败了。也许列表理解也不是处理这个问题的方法。

非常感谢您的帮助,谢谢。

【问题讨论】:

  • google和www的索引应该是2和3吧?
  • @thefourtheye - 不,每个项目都是自己的元组
  • 更新了示例数据结构以增加清晰度
  • 我不明白的是您在问题中提到的索引 [1] 的重要性。你的意思是,ww 应该在glue 条目中的com 元组和google 元组之间?
  • 也许我应该简单地说,意思是 'www' 不在任何元组中。

标签: python list tuples list-comprehension


【解决方案1】:

您可以在此处使用列表推导。也许最简单的方法是创建一组所有索引,然后返回缺失的索引。请注意,即使零件数组中有重复项,此答案也会为您提供所有缺失的组件(例如,如果“www”在零件中出现两次)。集合理解则不是这种情况。

# set of 0-based indices extracted from the 1-based tuples
indices = set(glue_tuple[0] - 1 for glue_tuple in data['glue'])

# array of missing parts, in order
missing_parts = [part for i, part in enumerate(data["parts"]) if i not in indices]

【讨论】:

    【解决方案2】:

    您可以使用set difference 操作。

    print set(data['parts'])-set(i[1] for i in data['glue'])
    >>> set(['www'])
    

    或者简单地使用list comprehensions:

    print [i for i in data['parts'] if i not in (j[1] for j in data['glue'])]
    >>> ['www']
    

    set 运算在速度部门获胜,运行运算10,000,000 次,我们可以看到列表推导耗时16s

    import timeit
    print timeit.timeit(lambda : set(data['parts'])-set(i[1] for i in data['glue']), number=10000000)
    >>> 16.8089739356
    print timeit.timeit(lambda : [i for i in data['parts'] if i not in (j[1] for j in data['glue'])], number=10000000)
    >>> 33.5426096522
    

    【讨论】:

    • Np :) 如果您认为我已经回答了这个问题,请随时检查是否已回答!
    • 两者兼而有之,set 解决方案效率更高
    • @mrdomoboto 我以更理论的方式考虑它,因为集合构造采用 nm 每个步骤,减法仅采用 n(因为集合中的测试成员资格是以恒定速度完成)以2n+m 结尾,而列表或多或少采用n*m,因为检查是通过线性搜索完成的。但是基准测试很不错:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多