- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
当我在 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/
我在此选择中有一堆选项,每个选项都有值,例如: context|cow context|test thing|1 thing|5 thing|27 context|beans 在循环选项时,我想构建一
我是一个 JavaScript 菜鸟。我一直在用谷歌搜索互联网,但没有答案对我有帮助。我有一个数据库 ID,必须以模式形式作为隐藏值发送。 echo "".$bl_total['id'].""; *
我正在尝试编写一种方法,根据用户输入一次更改 ArrayList 中所有对象的值。用户通过对话框输入一个值,然后将其转换为整数并分配给一个值。 该列表称为studentList,并用Student 对
所以我已经阅读了有关 ajax 的回调和异步行为的内容,但我不知道如何从 ajax 的附加值创建事件。 我有这个 html : var searchRequest = null; $(function
有两个表,report 和reportcomment。每个报告评论(通过外键)分配给一个报告,因此一个报告有零到多个报告评论。 如果我需要一个列表,它为我提供了所有报告以及每个报告的相应评论数量,我将
从下面的两个文件中,我得到了输出 (2000)1 但它应该只有 (2000) 在使用 curl 获取值后附加了额外的 1,但为什么呢? balance.php user_balance.php 最
我是一名优秀的程序员,十分优秀!