gpt4 book ai didi

python - 向列表附加值和分配值有什么区别?

转载 作者:太空宇宙 更新时间:2023-11-04 07:53:21 25 4
gpt4 key购买 nike

当我在 Python 中使用单行 for 循环时,根据我选择的进程(分配和追加进程),我将得到两个不同的值。我想了解其中的区别以及它们的工作原理。在下面的两个示例中,我尝试编写一个程序来返回一个列表,该列表仅包含列表之间共有的元素(没有重复项)。

第一个带有 append 的程序,我得到了正确的结果:

a = [1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]
b = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13]

def common_in_two_lists(list1, list2):
re_list = []
[re_list.append(val1) for val1 in list1 for val2 in list2 if val1==val2 and val1 not in re_list]
return re_list

调用函数并打印输出列表后:

l = common_in_two_lists(a, b)
print(l)

输出是:

[1, 2, 3, 5, 8, 13]

但是当我像下面这样使用分配方式时,我会得到错误的答案:

def common_in_two_lists(list1, list2):
re_list = []
re_list = [val1 for val1 in list1 for val2 in list2 if val1==val2 and val1 not in re_list]
return re_list

l = common_in_two_lists(a, b)
print(l)

输出是:

[1, 1, 2, 3, 5, 8, 13]

任何人都可以让我了解这两种不同的方式是如何工作的?

最佳答案

您需要将代码分解成更简单的形式才能理解它。举第一个例子。

a = [1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]
b = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13]


def common_in_two_lists1(list1, list2):
re_list = []
for val1 in list1:
for val2 in list2:
if val1 == val2 and val1 not in re_list:
re_list.append(val1)
print(re_list)
return re_list


l = common_in_two_lists1(a, b)

输出

[1]
[1, 2]
[1, 2, 3]
[1, 2, 3, 5]
[1, 2, 3, 5, 8]
[1, 2, 3, 5, 8, 13]

您可以看到 re_list 每次都附加值。而您为第一个示例放置的 [] 是无用的。

来到你的第二个例子。如果检查表达式的类型,您会发现它是生成器。

re_list = print(type(val1 for val1 in list1 for val2 in list2 if val1 == val2 and val1 not in re_list))
<class 'generator'>

并且生成器表达式仅在您尝试获取值时才被评估,这解释了为什么您在此代码中得到重复的 1。因为在创建生成器时,表达式 re_list 是空的。

终于找到您的解决方案了:

我试图编写一个返回列表的程序,该列表仅包含列表之间共有的元素(没有重复项)。

您应该遵循 Jon Clements 的建议并使用集合来实现它

you should take a look at sets... eg: list(set(a).intersection(b))

关于python - 向列表附加值和分配值有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52092566/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com