2

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

这是一个可比较的列表:

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]))
4

2 回答 2

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'}) ]

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

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'})]]
于 2013-09-27T04:02:29.240 回答
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'}))]

我相信这就是你要找的……我有点慢,但我想我还是完成它吧,哈哈。

于 2013-09-27T04:43:30.887 回答