【问题标题】:Comparing values in two lists in Python在 Python 中比较两个列表中的值
【发布时间】:2016-01-04 22:11:42
【问题描述】:

在 Python 2.7 中,我有两个整数列表:

x = [1, 3, 2, 0, 2]
y = [1, 2, 2, 3, 1]

我想创建第三个列表,指示 xy 中的每个元素是否相同,以产生:

z = [1, 0, 1, 0, 0]

如何使用列表推导来做到这一点?

我的尝试是:

z = [i == j for i,j in ...]

但我不知道如何完成。

【问题讨论】:

  • 我想你会得到一个布尔值列表。如果你喜欢它是 0,1,你可能需要做一些转换
  • @SomethingSomething 是的。您需要转换为int。看here :)

标签: python list python-2.7 list-comprehension


【解决方案1】:

虽然在问题中指定了列表理解并且上面的答案可能更好,但我认为我会加入递归解决方案:

def compare_lists(a, b, res=[]):
    if len(a) == len(b):
        if a == []:
            return res
        else:
            if a[0] == b[0]:
                res.append(1)
            else:
                res.append(0)
            return compare_lists(a[1:], b[1:])
    else:
        return "Lists are of different length."

【讨论】:

    【解决方案2】:

    您正在寻找zip

    z = [i == j for i,j in zip(x,y)]
    

    但您最好添加 int 调用以获得所需的输出

    >>> z = [int(i == j) for i,j in zip(x,y)]
    >>> z
    [1, 0, 1, 0, 0]
    

    否则你会得到一个类似[True, False, True, False, False]的列表


    正如ajcrcomment 中提到的,如果列表很长,最好使用 itertools.izip 而不是 zip。这是因为它返回一个迭代器而不是一个列表。 documentation中提到了这一点

    类似于 zip(),除了 它返回一个迭代器而不是一个列表。

    演示

    >>> from itertools import izip
    >>> z = [int(i == j) for i,j in izip(x,y)]
    >>> z
    [1, 0, 1, 0, 0]
    

    【讨论】:

    • 一个小脚注:如果列表很长,可能值得使用itertools.izip 而不是zip 以避免构建长的元组列表。当然,Python 3 没有这个问题。
    • @ajcr 完美。我总是忘记这一点(Py3 问题)。我将在那里添加一个小注释。谢谢。
    • 因此,如果不使用itertools.izip(或Python 3),它将为xy 中的每个元素运行zip(x,y)
    • @Karnivaurus 在 python3 中 zip 本身返回一个迭代器。你可以阅读它here
    • 还需要指出的是,转换为 int 并不是真正必要的,因为如果您尝试进行任何数学运算,python 会将 TrueFalse 分别视为 10他们。
    【解决方案3】:

    你可以稍微改变一下然后做:

    [x[i] == y[i] for i in xrange(len(x))]
    

    如果您使用 Python3 - 将 xrange 更改为 range

    【讨论】:

    • 这是有效的,但更pythonic的解决方案是使用zip
    • zip 的优点是它可以处理不同长度的列表。
    猜你喜欢
    • 2016-04-17
    • 2021-04-10
    • 1970-01-01
    • 1970-01-01
    • 2018-03-19
    • 2023-01-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多