好吧,这一直是我头痛的根源。我有一个列表,列表中的每个元素都是一个元组,每个元组都包含两个元素(一个字符串和一个字典)。
以下是可比较的清单:
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]))
答案 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'}))]
我相信这就是你要找的......我有点慢,但我想我也可以完成它大声笑。