【问题标题】:Comparing 2 lists and returning matches比较 2 个列表并返回匹配项
【发布时间】:2017-10-29 05:51:11
【问题描述】:

我有两个相互关联的函数 - 第一个删除相同且位于相同位置的字符,并返回不匹配的字符:

def remove(l1, l2):
    r = []
    for char in range(len(l1)):
        if l1[char] != l2[char]:
            r.append(l1[char])
    return r

虽然此函数遍历两个列表,并使用前一个函数删除相同的值。然后使用剩下的,它会在 b 中找到相同的值(但它们不需要位于相同的位置)。

def search(a, b):
    found = []
    elim = remove(a, b) 
    for char in elim:
        if char in b:
            find = 'y'
            found.append(find)
    return found

虽然我能够为我使用的其他示例返回正确数量的 'y',但当我有多个相同的值时它会中断。如果列表“b”中只有 1 个“V”,但列表“a”中有 2 个,我只希望为它返回 1 个“y”,而不是 2。由于我不确定从这里去哪里,我的函数返回:

    search(['L', 'F', 'V', 'V'], ['V', 'F', 'O', 'R'])
Expected:
    ['y']
Got:
    ['y', 'y']

提前致谢!

【问题讨论】:

  • remove() 中,您将整数添加到列表中,而不是字符。
  • @Mr.bug 会将其变成不可见的 ascii 字符。
  • r.append(char) 这是错误的,这将给出 char 而不是 char 的索引,你必须使用 r.append(l1[char])
  • 这里有你想要实现的算法吗?
  • 您的问题有问题。您声称看到的输出实际上不能来自您提供的代码。函数remove 填充一个包含整数的列表,并返回它。函数search 将此列表命名为elim,然后逐步查看它的任何元素是否在b 中。它们都不是,因为b 包含字符串而不是整数。 search 唯一可能的返回值是 []。

标签: python python-3.x list function


【解决方案1】:

这应该适合你:

def remove(l1, l2):
    return [char1 for char1, char2 in zip(l1, l2) if char1 != char2]

def search(a, b):
    elim = remove(a, b)
    return ['y' for char in set(elim) if char in b]

print(search(['L', 'F', 'V', 'V'], ['V', 'F', 'O', 'R']))

输出:['y']

我使用set(elim)remove() 创建的列表中删除重复项。

【讨论】:

  • 根据问题描述,这似乎是正确的。不过,似乎没有任何理由将 set(elim) 包装在 list() 中。
【解决方案2】:

试试这个

def remove(l1, l2):
    r = []
    print l1
    print l2
    for char in range(len(l1)):
        if l1[char] != l2[char]:
            #the below line your code appending index of char , i am appending char
            r.append(l1[char])
    return r


def search(a, b):
    found = []
    elim = remove(a, b)
    print elim
      #the below line your code iterating through all chars of elim , i am looping through only unique ones using set 
    for char in set(elim):
        if char in b:
            find = 'y'
            found.append(find)
    return found

【讨论】:

    【解决方案3】:

    将您的第二个函数更改为:

    def search(a, b):
        found = []
        elim = remove(a, b) 
        for char in elim:
            if a[char] in b:
                find = 'y'
                found.append(find)
                b.remove(a[char])
        return found
    

    这考虑到 elim 包含索引而不是字符。每当elim 索引一个“V”时,它将从b 中删除一个“V”。但是如果两个列表都包含两个'V',你将得到两个'y'。我不知道这是否是你想要的。你对问题的陈述不清楚。但我很确定您是 Python 初学者,还没有准备好使用其他答案中的高级概念。

    【讨论】:

    • 对不起,不够清晰!正如你所说,我是一个初学者,所以我很难表达我的意思。并感谢您的解释!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-12-19
    • 1970-01-01
    • 2015-12-29
    • 2016-12-23
    • 2010-11-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多