【问题标题】:Searching for Equivalence Among Elements of a List在列表的元素之间搜索等价
【发布时间】:2021-05-24 03:49:45
【问题描述】:

我有以下代码

Trans_Func = [['s1', '@', 's2'], ['s1', '@', 's4'], ['s2', '0', 's2'], ['s2', '1', 's3'], ['s3', '0', 's3'], ['s3', '1', 's3'], ['s3', '2', 's3'], ['s4', '1', 's4'], ['s4', '2', 's4'], ['s4', '2', 's5']]
new_rules = []
for i, j in Trans_Func:
    if i[0] == j[0] and i[1] == j[1]:
        #operation to append the new rule
print(new_rules)

我试图创建一个包含 Trans_Func 元素的新列表,仅当第一个字符串等价,第二个字符串等价,但第三个字符串不同时。我对 new_rules 的预期输出是:

new_rules = [['s1', '@', 's1, s4'], ['s4', '2', 's4, s5']]

我只是不知道如何遍历 Trans_Func 以尝试同时检查多个元素。

【问题讨论】:

  • 您是否应该将 ever 元素与其他所有元素进行比较,还是仅将列表中相邻的元素进行比较?
  • 第一个结果子列表不应该是['s1', '@', 's2, s4'] ???你好像打错了's1, s4'

标签: python list loops append


【解决方案1】:

您可以使用字典将匹配对作为键来管理,并将列表中的第三个字符串作为值累积。然后遍历字典以隔离具有多个关联的第三个字符串的对:

d = dict()
for s1,s2,s3 in Trans_Func: d.setdefault((s1,s2),[]).append(s3)
new_rules = [ [s1,s2,", ".join(ss)] for (s1,s2),ss in d.items() if len(ss)>1 ]

print(new_rules)
[['s1', '@', 's2, s4'], ['s4', '2', 's4, s5']]

【讨论】:

    【解决方案2】:

    你去了

    for i in range(len(Trans_Func)):
        IF i<len(Trans_Func)-1:
            if Trans_Func[i][1]==Trans_Func[i+1][1] and Trans_Func[i][2]==Trans_Func[i+1][2]:
                #operation to append the new rule
    

    【讨论】:

    • 谢谢。我理解这个代码背后的过程,肯定应该工作,但是在运行它时,我会被赋予索引错误,特别是列表索引超出范围。你知道为什么会是什么? span>
    • 尝试我编辑的答案。它检查i
    • 这是我的第一个猜测:也用一小时循环尝试并将长度升高1,但它仍然给出了相同的错误。 span>
    • 我刚刚编辑了我的答案来检查I 的值
    【解决方案3】:

    给你的变量一个合适的名字(小写且有意义),比如trans_list(例如)。
    使用有效的生成器表达式zip函数:

    trans_list = [['s1', '@', 's2'], ['s1', '@', 's4'], ['s2', '0', 's2'], ['s2', '1', 's3'], ['s3', '0', 's3'],
                  ['s3', '1', 's3'], ['s3', '2', 's3'], ['s4', '1', 's4'], ['s4', '2', 's4'], ['s4', '2', 's5']]
    new_rules = list([lst_1[0], lst_1[1], lst_1[2] + ', ' + lst_2[2]]
                     for lst_1, lst_2 in zip(trans_list[:-1], trans_list[1:])
                     if lst_1[:2] == lst_2[:2] and lst_1[2] != lst_2[2])
    print(new_rules)
    

    输出:

    [['s1', '@', 's2, s4'], ['s4', '2', 's4, s5']]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多