【发布时间】:2014-08-27 18:06:04
【问题描述】:
我在python中有一个类似下面的列表(真正的列表很大,我不能仅仅通过查看它来做到这一点):
original1=[['email', 'tel', 'fecha', 'descripcion', 'categ'],
['a@gmail.com', '1', '2014-08-06 00:00:06', 'MySpace a', 'animales'],
['b@gmail.com', '1', '2014-08-01 00:00:06', 'My Space a', 'ropa'],
['a@gmail.com', '2', '2014-08-06 00:00:06', 'My Space b', 'electronica'],
['b@gmail.com', '3', '2014-08-10 00:00:06', 'Myace c', 'animales'],
['c@gmail.com', '4', '2014-08-10 00:00:06', 'Myace c', 'animales']]
我将其拆分为数据和名称以处理数据:
datos=original1[-(len(original1)-1):len(original1)]
考虑到电子邮件和电话,我需要制作一个将所有重复项放在一起的字典,但我需要应用传递性:因为如果我们考虑电子邮件,第 0 行 = 第 2 行,但如果我们考虑电话,则第 1 行,而第 1 行1= 第 3 行 如果我们再次考虑电子邮件,我需要知道在这种情况下所有候选人都是 0、1、2 和 3,而 4 是单独的。
我创建了以下代码:
from collections import defaultdict
email_to_indices = defaultdict(list)
phone_to_indices = defaultdict(list)
for idx, row in enumerate(datos):
email = row[0].lower()
phone = row[1]
email_to_indices[email].append(idx)
phone_to_indices[phone].append(idx)
所以现在我需要应用传递性规则,将 0 到 3 和单独的 4 聚集在一起。
如果你打印
print 'email', email_to_indices
print 'phone', phone_to_indices
你得到:
email defaultdict(, {'a@gmail.com': [0, 2],'b@gmail.com': [1, 3], 'c@gmail.com': [4]})
phone defaultdict(, {'1': [0, 1], '3': [3], '2': [2], '4': [4]})
不知道如何获得考虑传递属性的人的联合。 我需要得到类似的东西:
first_group: [0, 1, 2, 3]
second_group:[4]
谢谢!
【问题讨论】:
-
输出dict的key应该是什么?它应该为每个唯一的电子邮件和电话都有一个密钥,每个都引用相同的数据列表,还是应该有某种由所有重叠的电子邮件和数字构成的合并密钥?您的预期输出是什么?
-
在我看来,自然的做法是像
[ [line0, line1, line2, line3], [line4] ]这样的数据结构 -
亚当,问题是这是一个例子,真正的桌子很大。这就是我写代码的原因。
-
GabyP 我只是提出一个数据结构来保存它,以回应@SilasRay 的评论,上面:)
标签: python dictionary transitivity