Python 比较平面列表和嵌套列表

Python 比较平面列表和嵌套列表,python,python-2.7,Python,Python 2.7,我想比较下面的两个列表edges是元组列表,而b_edge是元组嵌套列表。如果b_边[i][j]==边[0:2],我想在所有b_边[i][j]上附加边[i][2]。 以下是名单: edges = [('1.0', '2.0',{'length':0.35}),('2.0', '3.0',{'length':0.46,}),('3.0', '4.0', {'length':0.49}),(4.0, 5.0,{'length':0.22}),('5.0', '6.0',{'length':0.54}

我想比较下面的两个列表
edges
是元组列表,而
b_edge
是元组嵌套列表。如果b_边[i][j]==边[0:2],我想在所有b_边[i][j]上附加
边[i][2]。

以下是名单:

edges = [('1.0', '2.0',{'length':0.35}),('2.0', '3.0',{'length':0.46,}),('3.0', '4.0', {'length':0.49}),(4.0, 5.0,{'length':0.22}),('5.0', '6.0',{'length':0.54}),('6.0', '7.0', {'length':0.49}),('7.0', '8.0',{'length':0.22}),(5.0, 6.0,{'length':0.54})]

b_edge = [[('1.0', '2.0'), ('2.0', '3.0'), ('3.0', '4.0')], [('5.0', '6.0'), ('6.0', '7.0'), ('7.0', '8.0')]]
期望输出:

[[('1.0', '2.0', {'length': 0.35}), ('2.0', '3.0', {'length': 0.46}), ('3.0', '4.0', {'length': 0.49})], [('5.0', '6.0', {'length': 0.35}), ('6.0', '7.0', {'length': 0.46}), ('7.0', '8.0', {'length': 0.49})]
我试过这个:

result = []
for j in b_edge:
    temp = []
    for l,k in enumerate(j):
        if j[l][0:2] == edges[l][:2]:
            temp.append(k + (edges[l][2],))
    result.append(temp)
print 'result', result
我也检查了这些关于某某和类似问题的答案,但它们不完全符合我的要求

得到了这个结果:

[[('1.0', '2.0', {'length': 0.35}), ('2.0', '3.0', {'length': 0.46}), ('3.0', '4.0', {'length': 0.49})], []]
它似乎只将字典附加到嵌套列表中的第一个元素,而第二个元素只输出一个空列表

多谢各位

一条荣耀之线:

result = [[edge for edge in edges if (edge[0], edge[1]) in edge_group] for edge_group in b_edge]
“边缘”这个词现在在我嘴里感觉很奇怪

另外,我知道你说过数据是通过什么方式获得的,但我个人还是会把它改成这样的字典:

edge_lengths = {(edge[0], edge[1]): edge[2]['length'] for edge in edges}
# Gives you:
# {('1.0', '2.0'): 0.35, ('3.0', '4.0'): 0.49, ... , ('5.0', '6.0'): 0.54}

# Get lengths
print [[edge_lengths[edge] for edge in edge_group] for edge_group in b_edge]
# [[0.35, 0.46, 0.49], [0.54, 0.49, 0.22]]
当然,这取决于你:)

一句荣耀的话:

result = [[edge for edge in edges if (edge[0], edge[1]) in edge_group] for edge_group in b_edge]
“边缘”这个词现在在我嘴里感觉很奇怪

另外,我知道你说过数据是通过什么方式获得的,但我个人还是会把它改成这样的字典:

edge_lengths = {(edge[0], edge[1]): edge[2]['length'] for edge in edges}
# Gives you:
# {('1.0', '2.0'): 0.35, ('3.0', '4.0'): 0.49, ... , ('5.0', '6.0'): 0.54}

# Get lengths
print [[edge_lengths[edge] for edge in edge_group] for edge_group in b_edge]
# [[0.35, 0.46, 0.49], [0.54, 0.49, 0.22]]
当然,这取决于你:)

试试这个:

result = b_edge
tmp_dict = { (i[0],i[1]): i[2] for i in edges }
for index_j, j in enumerate(b_edge):
    for index_i, i in enumerate(j):
        if i in tmp_dict:
            result[index_j][index_i] = result[index_j][index_i] + (tmp_dict[i],)
我创建了一个字典,将元组映射到{“length”}字典,并使用它生成所需的输出。

尝试以下方法:

result = b_edge
tmp_dict = { (i[0],i[1]): i[2] for i in edges }
for index_j, j in enumerate(b_edge):
    for index_i, i in enumerate(j):
        if i in tmp_dict:
            result[index_j][index_i] = result[index_j][index_i] + (tmp_dict[i],)

我创建了一个字典,将元组映射到{“length”}字典,并使用它生成所需的输出。

我将创建一个数字元组到长度的映射,如下所示:

>>> num_to_len = {x[0:2]:x[2] for x in edges}
>>> num_to_len
{(4.0, 5.0): {'length': 0.22}, ('3.0', '4.0'): {'length': 0.49}, (5.0, 6.0): {'length': 0.54}, ('1.0', '2.0'): {'length': 0.35}, ('6.0', '7.0'): {'length': 0.49}, ('2.0', '3.0'): {'length': 0.46}, ('7.0', '8.0'): {'length': 0.22}, ('5.0', '6.0'): {'length': 0.54}}
>>> [[x if x not in num_to_len else x+(num_to_len[x],) for x in b_edge[0]]]
[[('1.0', '2.0', {'length': 0.35}), ('2.0', '3.0', {'length': 0.46}), ('3.0', '4.0', {'length': 0.49})]]
然后按照以下方式构建您想要的结果:

>>> num_to_len = {x[0:2]:x[2] for x in edges}
>>> num_to_len
{(4.0, 5.0): {'length': 0.22}, ('3.0', '4.0'): {'length': 0.49}, (5.0, 6.0): {'length': 0.54}, ('1.0', '2.0'): {'length': 0.35}, ('6.0', '7.0'): {'length': 0.49}, ('2.0', '3.0'): {'length': 0.46}, ('7.0', '8.0'): {'length': 0.22}, ('5.0', '6.0'): {'length': 0.54}}
>>> [[x if x not in num_to_len else x+(num_to_len[x],) for x in b_edge[0]]]
[[('1.0', '2.0', {'length': 0.35}), ('2.0', '3.0', {'length': 0.46}), ('3.0', '4.0', {'length': 0.49})]]

请注意,如您所指定的,将所有内容包装到另一个列表中可能不是必需的。因此,除非你有充分的理由,否则请跳过列表中最外层的括号。

我将创建一个数字元组到长度的映射,如下所示:

>>> num_to_len = {x[0:2]:x[2] for x in edges}
>>> num_to_len
{(4.0, 5.0): {'length': 0.22}, ('3.0', '4.0'): {'length': 0.49}, (5.0, 6.0): {'length': 0.54}, ('1.0', '2.0'): {'length': 0.35}, ('6.0', '7.0'): {'length': 0.49}, ('2.0', '3.0'): {'length': 0.46}, ('7.0', '8.0'): {'length': 0.22}, ('5.0', '6.0'): {'length': 0.54}}
>>> [[x if x not in num_to_len else x+(num_to_len[x],) for x in b_edge[0]]]
[[('1.0', '2.0', {'length': 0.35}), ('2.0', '3.0', {'length': 0.46}), ('3.0', '4.0', {'length': 0.49})]]
然后按照以下方式构建您想要的结果:

>>> num_to_len = {x[0:2]:x[2] for x in edges}
>>> num_to_len
{(4.0, 5.0): {'length': 0.22}, ('3.0', '4.0'): {'length': 0.49}, (5.0, 6.0): {'length': 0.54}, ('1.0', '2.0'): {'length': 0.35}, ('6.0', '7.0'): {'length': 0.49}, ('2.0', '3.0'): {'length': 0.46}, ('7.0', '8.0'): {'length': 0.22}, ('5.0', '6.0'): {'length': 0.54}}
>>> [[x if x not in num_to_len else x+(num_to_len[x],) for x in b_edge[0]]]
[[('1.0', '2.0', {'length': 0.35}), ('2.0', '3.0', {'length': 0.46}), ('3.0', '4.0', {'length': 0.49})]]

请注意,如您所指定的,将所有内容包装到另一个列表中可能不是必需的。因此,除非你有充分的理由,否则请跳过列表理解中最外层的括号。

@timgeb,将第一个列表中的list和append dictionary与第二个列表中的匹配元素进行比较。谢谢你你考虑过把你的优点写进字典吗?类似于
{(“1.0”、“2.0”):0.35、(“2.0”、“3.0”):0.46
}。这将使您的问题更简单、更直观。我很想这样做,但这是我所做的
edges\u dict={(edge[0],edge[1]):edge[2]['length']for edge in edges}
在您的预期输出中,
('5.0','6.0',{'length':0.35})来自哪里?@timgeb,将第一个列表中的list和append dictionary与第二个列表中的匹配元素进行比较。谢谢你你考虑过把你的优点写进字典吗?类似于
{(“1.0”、“2.0”):0.35、(“2.0”、“3.0”):0.46
}。这将使您的问题更简单、更直观。我很想这样做,但这是我所做的
edges\u dict={(edge[0],edge[1]):edge[2]['length']for edge in edges}
在哪里
('5.0','6.0',{'length':0.35})
来自您期望的输出?这很接近,但是您能帮助我将其输出为嵌套列表格式,如:[('1.0','2.0','length':0.35}],('2.0','3.0','length':0.46}),('3.0','4.0','length':0.49}),[('5.0','6.0','length',{'length':0.54}),('6.0','7.0','length':0.49}),('7.0','length','8.0','length})]谢谢你谢谢Hanks@pokey,你的一行很漂亮Hanks@Nobi,总有一天我会把它给我的孙子们看的。这很接近,但是你能帮我把它做成一个嵌套的列表格式吗?[('1.0','2.0','length':0.35}],('2.0','3.0','length':0.46}),('3.0','4.0','length':0.49}),[('5.0','6.0','length':0.54}),('6.0','7.0',{'length':0.49}),('7.0','8.0',{'length':0.22})谢谢你谢谢Hanks@pokey,你的一行是辉煌的indeedThanks@Nobi,有一天我会把它给我的孙子们看。这很接近了,但你能帮我把它换成这样的嵌套列表格式:[[('1.0','2.0','length':0.35}],('2.0','3.0',{'length':0.46}),('3.0','4.0',{'length':0.49}),[('5.0','6.0',{'length':0.54}),('6.0','7.0',{'length':0.49}),('7.0','8.0',{'length':0.22})]谢谢这很接近,但你能帮我找到一个这样的嵌套列表格式:[('1.0','2.0','length',{'length':0.35},('2.0','3.0','length',{'0.46})[('5.0','6.0',{'length':0.54}),('6.0','7.0',{'length':0.49}),('7.0','8.0',{'length':0.22})谢谢