用元组列表和元组列表进行列表理解

2024-05-12 09:00:48 发布

您现在位置:Python中文网/ 问答频道 /正文

在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语句来生成一个缺少的片段的列表,但这充其量是非常混乱的。我试过列表理解,但失败了。也许列表理解也不是解决这个问题的方法。

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


Tags: 代码com示例数据结构内容列表datawww
2条回答

你可以在这里使用列表理解。也许最简单的事情就是创建一组所有索引,然后返回丢失的索引。请注意,即使零件数组中有重复项(例如,如果“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]

您可以使用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操作在speed部门胜出,运行操作10000000次,我们可以看到列表理解接管的时间比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

相关问题 更多 >