词典之间的python传递性

词典之间的python传递性,python,dictionary,transitivity,Python,Dictionary,Transitivity,在python中,我有一个类似于以下的列表(真正的列表是巨大的,我无法仅通过查看它来实现这一点): 我将其拆分为数据和名称以处理数据: datos=original1[-(len(original1)-1):len(original1)] 我需要做一个字典,把所有的副本放在一起,考虑电子邮件和TEL,但是我需要应用及物性:因为第0行=第2行,如果我们考虑电子邮件,但是第1行,如果我们考虑TEL,行1=行3,如果我们再次考虑电子邮件,我需要得到在这种情况下所有的候选者是0,1,2和3,而4是单独

在python中,我有一个类似于以下的列表(真正的列表是巨大的,我无法仅通过查看它来实现这一点):

我将其拆分为数据和名称以处理数据:

datos=original1[-(len(original1)-1):len(original1)]

我需要做一个字典,把所有的副本放在一起,考虑电子邮件和TEL,但是我需要应用及物性:因为第0行=第2行,如果我们考虑电子邮件,但是第1行,如果我们考虑TEL,行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
你会得到:

电子邮件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]})

不知道如何得到那些考虑传递性质的并集。 我需要像这样的东西:

第一组:[0,1,2,3]
第二组:[4]

谢谢

这里有一个图表,或者更准确地说。节点有两种类型:电子邮件和电话。如果存在与该电子邮件和电话相关的记录,则会连接两个节点。或者我们甚至可以说记录本身就是连接两个节点的边

任务是找到这张图的一部分。通过以下链接,您可以找到可以在线性时间内完成此操作的算法

当然,也可以发明一些快速而肮脏的解决方案,如果您的数据集足够小,甚至可能被认为是合适的

您可以在这里找到一些Python实现:

更新:以下是一个如何构建图形的示例:

graph = {};
EMAIL = "email";
PHONE = "phone";

for rec in datos:
    graph.setdefault((EMAIL, rec[0]), set()).add((PHONE, rec[1]));
    graph.setdefault((PHONE, rec[1]), set()).add((EMAIL, rec[0]));

print "\n".join("%s: %s" % (str(node), str(linkedNodes)) for (node, linkedNodes) in graph.iteritems());

所以每个节点都有一个类型(
EMAIL
PHONE
,它们实际上可以是整数,例如0和1,我将它们设置为字符串只是为了更好地打印)和一个值。Graph是一个字典,节点作为键,连接的节点集作为值。

这是另一种方法:

当您构建
email\u to\u索引
字典时,您可以将该行的电话号码存储为值,然后让
phone\u to\u索引
拥有该行的索引。这样我们就创建了一个
email\u to\u索引
to
phone\u to\u索引
to行映射的索引

通过这些修改和基本的设置操作,我可以得到您想要的:

from collections import defaultdict

email_to_indices = defaultdict(list)
phone_to_indices = defaultdict(list)
combined = defaultdict(set)

original=[['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']]


for idx, row in enumerate(original[1:], start=1):
    email = row[0].lower()
    phone = row[1]
    email_to_indices[email].append(phone) # Here is what I changed
    phone_to_indices[phone].append(idx)

random_key = 0
for idx, row in enumerate(original[1:], start=1):
    grouped_rows = []
    if row[0].lower() in email_to_indices:
        for phone_no in email_to_indices[row[0].lower()]:
            grouped_rows.extend(phone_to_indices[phone_no])

    if len(combined[random_key]) > 0 and len(set(grouped_rows).intersection(combined[random_key])) > 0:
        combined[random_key].update(set(grouped_rows))
    elif len(combined[random_key]) > 0:
        random_key += 1
        combined[random_key].update(set(grouped_rows))
    else:
        combined[random_key].update(set(grouped_rows))

print combined
这使得:

defaultdict(<type 'set'>, {0: set([1, 2, 3, 4]), 1: set([5])})
defaultdict(,{0:set([1,2,3,4]),1:set([5]))

输出指令的键应该是什么?它应该为每个引用相同数据列表的唯一电子邮件和电话设置一个密钥,还是应该为所有重叠的电子邮件和号码构建某种合并密钥?您期望的输出是什么?在我看来,自然的操作过程是一些数据结构,如
[[line0,line1,line2,line3],[line4]
Adam,问题是这是一个示例,真正的表是巨大的。这就是为什么我要写code.GabyP,我只是提出一个数据结构来保存它,作为对上面@SilasRay评论的回应:)嗨,安东,这是个好主意,但是python中有这样做的模块吗?那会是怎样的呢?@GabyP我想不会,但是提供了很多信息,包括相关的问题等等。
defaultdict(<type 'set'>, {0: set([1, 2, 3, 4]), 1: set([5])})