在我的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语句生成缺失部分的列表,但最好是非常混乱。我尝试过列表推导并且失败了。也许列表理解不是解决这个问题的方法。
非常感谢您的帮助,谢谢。
答案 0 :(得分:4)
您可以使用set difference操作。
formData: Array<FormData>
或仅使用list comprehensions:
print set(data['parts'])-set(i[1] for i in data['glue'])
>>> set(['www'])
设置操作在速度部门中胜出,运行 10,000,000次,我们可以看到列表理解接管 16s :
print [i for i in data['parts'] if i not in (j[1] for j in data['glue'])]
>>> ['www']
答案 1 :(得分:0)
您可以在此处使用列表推导。也许最简单的方法是创建一组所有索引,然后返回缺少的索引。请注意,即使零件数组中有重复项,此答案也会为您提供所有缺少的组件(例如,如果“www”部分出现两次)。这不是set comprehension的情况。
# 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]