Python 列表理解与列表和元组列表

Python 列表理解与列表和元组列表,python,list,tuples,list-comprehension,Python,List,Tuples,List Comprehension,在我的Python 2.7.5代码中,我有以下数据结构: 一个简单的列表 >>> data["parts"] ['com', 'google', 'www'] …和元组列表 >>> data["glue"] [(1L, 'com'), (3L, 'google')] 当输入存在这些结构的代码时,我将始终知道数据[“部分”]中的内容数据[“粘合”]充其量将包含与数据[“部分”]中的内容“匹配”元组-最坏情况下数据[“粘合”]可以为空。我需要知道的是胶水上缺少

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

一个简单的列表

>>> data["parts"]
['com', 'google', 'www']
…和元组列表

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

我首先尝试通过各种for循环和if语句生成一个缺失片段的列表,但充其量也非常混乱。我尝试过列表理解,但失败了。也许列表理解也不是解决这个问题的方法


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

您可以在此处使用列表理解。也许最简单的方法是创建一组所有索引,然后返回缺少的索引。注意:此答案将为您提供所有缺少的组件,即使零件数组中存在重复的组件(例如,如果“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]

您可以在这里使用列表理解。也许最简单的方法是创建一组所有索引,然后返回缺少的索引。注意:此答案将为您提供所有缺少的组件,即使零件数组中存在重复的组件(例如,如果“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]
您可以使用操作

print set(data['parts'])-set(i[1] for i in data['glue'])
>>> set(['www'])
或者简单地使用:

设置操作在速度部门获胜,运行操作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
您可以使用操作

print set(data['parts'])-set(i[1] for i in data['glue'])
>>> set(['www'])
或者简单地使用:

设置操作在速度部门获胜,运行操作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

google和www的索引分别是2和3,对吗?@thefourtheye-不,每个项目都将是自己的元组更新的示例数据结构,以增加清晰度。我不明白的是你在问题中提到的索引[1]的重要性。你的意思是,ww应该在
glue
条目中的
com
元组和
google
元组之间?也许我应该简单地说,意思是“www”不在任何元组中。谷歌和www的索引分别是2和3,对吗?@theourtheye-不,每个项目都将是自己的元组更新的示例数据结构,以增加清晰度。我不理解的是您在问题中提到的索引[1]的重要性。你的意思是,ww应该在
glue
条目中的
com
元组和
google
元组之间?也许我应该简单地说“www”的意思不在任何元组中。Np:)如果你认为我已经回答了这个问题,请随意检查答案!在这两者中,
set
解决方案更为重要efficient@mrdomoboto我用了一种更为理论化的方式来思考它,因为集合构造需要
n
m
每一步,减法只需要
n
(因为集合中的测试成员身份是以恒定的速度完成的)以
2n+m
结束,而列表或多或少地采用
n*m
,因为检查是通过线性搜索完成的。但是基准测试很好:)Np:)如果你认为我已经回答了这个问题,请随意检查答案!在这两者中,
set
解决方案更为重要efficient@mrdomoboto我用了一种更为理论化的方式来思考它,因为集合构造需要
n
m
每一步,减法只需要
n
(因为集合中的测试成员身份是以恒定的速度完成的)以
2n+m
结束,而列表或多或少地采用
n*m
,因为检查是通过线性搜索完成的。但基准是一个不错的选择:)