Python - 比较嵌套列表并将匹配附加到新列表?

Dar*_*ick 5 python compare list

我希望与不等长的嵌套列表进行比较.我只对每个子列表的第一个元素之间的匹配感兴趣.如果存在匹配,我希望将匹配添加到另一个列表,以便随后转换为制表符分隔文件.以下是我正在使用的示例:

x = [['1', 'a', 'b'], ['2', 'c', 'd']]

y = [['1', 'z', 'x'], ['4', 'z', 'x']]

match = []

def find_match():
    for i in x:
        for j in y:
            if i[0] == j[0]:
                 match.append(j)
            return match
Run Code Online (Sandbox Code Playgroud)

返回:

[['1', 'x'], ['1', 'y'], ['1', 'x'], ['1', 'y'], ['1', 'z', 'x']]
Run Code Online (Sandbox Code Playgroud)

重新处理列表以删除重复项是一种好的做法还是可以以更简单的方式完成?

另外,为了进行比较,使用元组和/或元组元组是否更好?

任何帮助是极大的赞赏.

此致,Seafoid.

Mik*_*ham 6

  • 使用集合来获取没有重复项的集合.

    • 您必须使用元组而不是列表作为项目,因为设置项必须是可清除的.
  • 您发布的代码似乎不会生成您发布的输出.我不知道你应该如何从该输入生成输出.例如,输出有'y'输入而输入没有.

  • 我认为你的功能设计可以大大改进.目前,您定义x,ymatch作为模块级别,并显式读取和变异它们.这不是你想要设计函数的方式 - 作为一般规则,函数不应该在全局级别改变某些东西.它应该显式传递它需要的所有东西并返回结果,而不是隐式地接收信息并改变自身之外的东西.

    我会改变

    x = some list
    y = some list
    match = []
    def find_match():
        for i in x:
            for j in y:
                if i[0] == j[0]:
                     match.append(j)
        return match # This is the only line I changed. I think you meant 
                     # your return to be over here?
    find_match()
    
    Run Code Online (Sandbox Code Playgroud)

    x = some list
    y = some list
    
    def find_match(x, y):
        match = []
        for i in x:
            for j in y:
                if i[0] == j[0]:
                     match.append(j)
         return match
    match = find_match(x, y)
    
    Run Code Online (Sandbox Code Playgroud)
  • 要将最后一次更改提升到下一级别,我通常会替换该模式

    def f(...):
        return_value = []
        for...
            return_value.append(foo)
        return return_value
    
    Run Code Online (Sandbox Code Playgroud)

    与类似的发电机

    def f(...):
        for...
            yield foo
    
    Run Code Online (Sandbox Code Playgroud)

    这将产生上述功能

    def find_match(x, y):
        for i in x:
            for j in y:
                if i[0] == j[0]:
                     yield j
    
    Run Code Online (Sandbox Code Playgroud)

    另一种表达此生成器效果的方法是使用生成器表达式(j for i in x for j in y if i[0] == j[0]).