Python 3:比较主列表中的元组?

时间:2013-09-27 03:57:05

标签: python list dictionary compare tuples

好吧,这一直是我头痛的根源。我有一个列表,列表中的每个元素都是一个元组,每个元组都包含两个元素(一个字符串和一个字典)。

以下是可比较的清单:

list_of_tuples = [ ('one':{'a':'b'}), ('one':{'c':'b'}), ('two':{'a':'b'}), ('two':{'d':'e'}), ('three':{'d':'e'}) ]

我正在尝试构建网络图,在这种情况下,“一个”,“两个”和“三个”对应于网络上的不同节点。每个节点上的每个接口都有一个元组。字典表示网络地址和子网掩码。对于要连接到另一个接口的接口(其中一个元组),当两个接口共享相同的网络地址和子网掩码时(它们的字典相同)。

最终,我想得到一个新的元组列表,新元组的元素只是代表原始列表中连接接口的两个元组。

换句话说,我想结束这样的事情:

list_of_connections = [( ('one':{'a':'b'}),('two':{'a':'b'}) ),  ( ('two':{'d':'e'}),('three':{'d':'e'}) )]

我正在试图弄清楚如何实现这一目标。有没有人对如何实现这一点有任何意见?请注意,目前,高性能不是首要任务。原始列表并不总是必须包含5个接口,并且并不总是必须有两个连接。

编辑:

我提出了以下解决方案,虽然效率低于Manoj发布的解决方案。

connections = list()

for i in range(len(list_of_tuples)):
    for k in range(len(list_of_tuples)):
        if connections.count((list_of_tuples[k],list_of_tuples[i])) == 0 and ((list_of_tuples[i][1] == list_of_tuples[k][1]) and (list_of_tuples[i][0] != list_of_tuples[k][0])):
            connections.append((list_of_tuples[i],list_of_tuples[k]))

2 个答案:

答案 0 :(得分:2)

对于字符串和字典,你应该有('one',{'a':'b'})而不是('one':{'a':'b'})。使用('one':{'a':'b'}),Python可能会期待一本字典。上面的代码实际上会导致语法错误。

如果你想将list_of_connections构建为元组列表,其中每个元组包含一个字符串和字典,那么这里就可以使用了

list_of_tuples = [ ('one', {'a':'b'}), ('one', {'c':'b'}), ('two', {'a':'b'}), ('two', {'d':'e'}), ('three', {'d':'e'}) ]

一种简单的方法是使用(地址:子网)元组作为字典的键来收集所有节点,并且该键的值将是列表。这将确保具有相同地址/子网组合的所有元素都放在同一个存储桶中。接下来,您可以迭代字典值以创建列表列表。我会试试这个:

connections = {}
for elem in list_of_tuples:
    new_key = (list(elem[1].keys())[0], list(elem[1].values())[0])
    if (new_key in connections):
       connections[new_key].append(elem)
    else:
       connections[new_key] = [elem]

list_of_connections = []
for k, v in connections.items():
    list_of_connections.append(v)

print(list_of_connections)

输出结果为:

[[('one', {'a': 'b'}), ('two', {'a': 'b'})], [('one', {'c': 'b'})], [('two', {'d': 'e'}), ('three', {'d': 'e'})]]

答案 1 :(得分:2)

list_of_tuples = [ ('one',{'a':'b'}), ('one',{'c':'b'}), ('two',{'a':'b'}), ('two',{'d':'e'}), ('three',{'d':'e'}) ]

found = []
matches = []
for name, conn in list_of_tuples:

    finder = [(first, second) for first, second in found if second == conn]
    if len(finder) == 1:      
        matches.append(((name, conn), finder[0]))
    else:
        found.append((name, conn))



print matches

输出:

[(('two', {'a': 'b'}), ('one', {'a': 'b'})), (('three', {'d': 'e'}), ('two', {'d': 'e'}))]

我相信这就是你要找的......我有点慢,但我想我也可以完成它大声笑。