如何遍历一个嵌套列表,比较匹配的特定元素,根据匹配创建具有特定不同元素的字典?

How to iterate over one nested list, compare specific elements for a match, create a dictionary with specific different elements based on the match?

提问人:user19375127 提问时间:6/20/2022 最后编辑:user19375127 更新时间:6/21/2022 访问量:105

问:

我对 Python 非常陌生,正在寻求帮助:我有一个嵌套列表:

[['t', '=', 'a', '+1', 'b'], ['s', '=', 'd', '+2', 'e'], ['p', '=', 't', '*1', 'c'], ['q', '=', 's', '/1', 'f'], ['y', '=', 'p', '-1', 'q']].

我想将每个子列表的每个第 1 个元素与所有子列表的所有第 3 个和第 5 个元素进行比较以找到匹配项。例如:作为第 1 个子列表中的第 1 个元素与(每个子列表的第 3 个和第 5 个元素)进行比较,以在元素中找到潜在的匹配项。然后我比较(第 2 个子列表的第 1 个元素)与所有子列表的第 3 个和第 5 个元素。我重复此操作,直到我将每个子列表的所有第 1 个元素与所有子列表的每个第 3 个和第 5 个元素进行比较。't''a', 'b', 'd', 'e', 't', 'c', 's', 'f', 'p', 'q''s'

之后,无论我在哪里找到匹配项(例如,当第一个子列表中的第一个元素被定位为第三个子列表中的第三个元素时,等等),我想将这 2 个子列表中的第 4 个元素(运算符)连接在一起作为字典来表示图形的节点。例如,对于在子列表 1 和 3 中找到的匹配项,运算符(子列表 1 中的第 4 个元素)将是“键”,运算符(子列表 3 中的第 4 个元素)将是字典的相应“值”。同样,对于找到的匹配项,和将是键值对,对于找到的匹配项,将连接,依此类推,直到比较所有第 1 元素子列表以查找匹配项。't''t'+1*1's''+2''/1''p''*1''-1'

我尝试了以下方法,但它返回一个空列表[]作为输出:

op_connector1 = [] #I 现在创建了一个空列表来收集图节点的所有所需运算符,但最终想要一个字典,就像我上面所说的那样。

list = [['t', '=', 'a', '+1', 'b'], ['s', '=', 'd', '+2', 'e'], ['p', '=', 't', '*1', 'c'], ['q', '=', 's', '/1', 'f'], ['y', '=', 'p', '-1', 'q']]

for i in range(len(list)):

if (list[i][0] == list[i][2]) or (list[i][0] == list[i][4]):
    op_connector1.append(i[i][3])
print("\n", op_connector1)

所需输出:

{'+1': '*1', '+2': '/1', '*1': '-1', '/1': '-1'}

将不胜感激。提前致谢。

python python-3.x 列表 python-2.7 嵌套列表

评论

0赞 BrokenBenchmark 6/21/2022
您的预期产出是多少?请编辑您的帖子以包含此信息。具体写出来;不要只提供高级描述。

答:

0赞 Dante 6/20/2022 #1

试试那个

super_arr=[
    ['t', '=', 'a', '+1', 'b'],
    ['s', '=', 'd', '+2', 'e'], 
    ['p', '=', 't', '*1', 'c'], 
    ['q', '=', 's', '/1', 'f'],
    ['y', '=', 'p', '-1', 'q']
    ]
def compare_list(super_array):
    dict={}
    for array in super_array:
        
        for each_list in super_array:
            if array[0] in (each_list[2],each_list[4]):
                dict[array[3]]=each_list[3]
            
    return dict
 #calling the function and printing its output
               
print(compare_list(super_arr))
    

output:


    {'+1': '*1', '+2': '/1', '*1': '-1', '/1': '-1'}

或者

super_arr=[
    ['t', '=', 'a', '+1', 'b'],
    ['s', '=', 'd', '+2', 'e'], 
    ['p', '=', 't', '*1', 'c'], 
    ['q', '=', 's', '/1', 'f'],
    ['y', '=', 'p', '-1', 'q']
    ]
def compare_list(super_array):
    dict={}
    for array in super_array:
        subdict={}
        
        for each_list in super_array:
            if array[0] in (each_list[2],each_list[4]):
                subdict[array[3]]=each_list[3]
        dict[array[0]]=subdict
    return dict
 #calling the function and printing its output                
print(compare_list(super_arr))
    

Output:
{'t': {'+1': '*1'}, 's': {'+2': '/1'}, 'p': {'*1': '-1'}, 'q': {'/1': '-1'}, 'y': {}}

使用列表推导式,该函数可以写成

def compare_list(super_array):
    dict={}
    for array in super_array:
        x={array[3]:each_list[3] for each_list in super_array if array[0] in (each_list[2],each_list[4])}
        dict[array[0]]=x
    return dict

对于重复的密钥,可以使用以下函数

def compare_list(super_array):
    list_of_dicts=[]
    for array in super_array:
        subdict={}
        
        for each_list in super_array:
            if array[0] in (each_list[2],each_list[4]):
                subdict[array[3]]=each_list[3]
                list_of_dicts.append(f'{array[0]}:{subdict}')
        # dict[array[0]]=subdict
    return list_of_dicts

output:
["t:{'+1': '+2'}", "t:{'+1': '*1'}", "s:{'+2': '/1'}", "p:{'*1': '-1'}", "q:{'/1': '-1'}"]

评论

0赞 BhusalC_Bipin 6/20/2022
您可以将它们组合在一起,而不是使用两个列表,if array[0] in (each_list[2], each_list[4])
0赞 BhusalC_Bipin 6/20/2022
此外,在嵌套的 for 循环中,您不需要从头开始迭代,而是可以从当前索引 + 1 开始。
0赞 Dante 6/20/2022
哦,是的,我不得不结合.我怎么错过了那部分....!!!对于第二条评论,我只是在考虑是否在上一个列表中找到匹配项,我会从 index+1.ie 开始错过它。如果提供的列表是 ['t', '=', 'p', '+1', 'b'], ['s', '=', 'q', '+2', 'e'], ['p', '=', 't', '*1', 'c'], ['q', '=', 's', '/1', 'f'],['y', '=', 'a', '-1', 'd'] ]
0赞 BhusalC_Bipin 6/20/2022
是的,你是对的。
0赞 BhusalC_Bipin 6/20/2022
确定。愿你安好