【问题标题】:I have two sets of data and I need to build a data structure that organizers them into sets. (Python)我有两组数据,我需要构建一个将它们组织成组的数据结构。 (Python)
【发布时间】:2016-08-11 02:48:33
【问题描述】:

使用 Python 2.7。我有一组由 id 标签组成的数据:

SET1=[{'MISC': u'2759'}, {'MISC': u'2759'}, {'MISC': u'2759'}, {'MISC': u'2758'},{'MISC': u'2758'}, {'MISC': u'1751'}]

和另一个由不同的id标签组成的集合:

SET2= [u'15672542c8ed280b', u'1566b77702f8865f', u'1565c2241aebb314', u'155c6888c507e365', u'155c5b8ded9a7c03', u'155c1173f58f1494']

如您所见,集合是一对一的,每个 MISC 标签都与 SET2 中的相应 id 相关。例如,SET1 中的第一个元素 {'MISC': u'2759'} 需要与 SET2 中的第一个元素 u'15672542c8ed280b' 相关。

理想情况下,我想构建一个像这样的数据结构:

Matched_IDS=[{2759, 15672542c8ed280b}, {2759, 1566b77702f8865f} , {2759, 1565c2241aebb314}, {...}, {...} ]

到目前为止,我尝试了这种方法,但是由于我使用了两个 for 循环,因此我对数据进行了两次迭代,并得到了一个非常难看的集合:

MSGMatch=[]
    for a in SET1:
        for b in SET2:
            MSGMatch.append({str(a),str(b)})
    print(MSGMatch)

任何人有一个更优雅、更有效的解决方案,他们可以为我指明正确的方向吗?

【问题讨论】:

  • 如果它们是真正的集合,元素没有任何特定的顺序,因此两个集合之间的元素不能对应。你真的是说你有 2 个列表
  • 你为什么不直接压缩?
  • 请注意,在 Python 中 set 是一种数据类型。最好重命名您的列表以避免任何混淆。
  • @ScottHunter 是的,我的意思是列表,它们现在都是列表

标签: python set


【解决方案1】:

在一次迭代中,您可以尝试:

[{a['MISC'], b} for a, b in zip(SET1, SET2)]

这将生成您指定的集合列表。

这更清楚地显示了如何在一次迭代中迭代两个列表:

result = []
for i, a in enumerate(SET1):
    result.append({a['MISC'], SET2[i]})

【讨论】:

  • 这不还是两次迭代吗?一个用于 zip,一个用于列表理解?
  • 在 Python 3 中,zip 是一个生成器。生成器将在列表推导迭代以形成列表时被消耗。在 Python 2 中, zip 生成列表(除非您使用 itertools.izip 或来自future_builtins 的 zip)。无论如何,即使在 Python 3 中,您构建它的方式也会导致 2 次迭代,因为您需要首先生成内部列表理解,然后 zip 将只是一个您必须再次迭代的生成器。请参阅我编辑的答案,该答案更清楚地显示了如何一次性完成。
【解决方案2】:
zip([m['MISC'] for m in SET1], SET2)

假设您的“集合”(它们实际上是列表)的长度相同,那应该可以满足您的需求。

【讨论】:

  • 是的,抱歉,我的意思是列表。对一切都有些陌生,所以我的术语还不是最好的,感谢您纠正我:)
  • 但是您仍然迭代两次:一次用于列表理解,另一次用于 zip。
猜你喜欢
  • 2014-06-22
  • 2015-12-16
  • 1970-01-01
  • 1970-01-01
  • 2020-11-25
  • 2023-03-12
  • 2021-12-06
  • 2018-09-10
  • 1970-01-01
相关资源
最近更新 更多