Python 3.x 更改For循环中的列表元素

Python 3.x 更改For循环中的列表元素,python-3.x,list,Python 3.x,List,这个脚本可以满足我的需要,但是在研究如何实现它的时候,我发现很多评论认为这是一种错误的方式。我发现的注释不是很具有描述性,并且似乎不适用于我的用例。我无法确定这是否或为什么是错误的,我能做些什么来改进这一点 myList1 = [1, 2, 3, 4, 5] myList2 = [1, 3, 5] myList3 = [] for i in myList1: myList3.append(0) for j in range(len(myList1)): for k in ran

这个脚本可以满足我的需要,但是在研究如何实现它的时候,我发现很多评论认为这是一种错误的方式。我发现的注释不是很具有描述性,并且似乎不适用于我的用例。我无法确定这是否或为什么是错误的,我能做些什么来改进这一点

myList1 = [1, 2, 3, 4, 5]
myList2 = [1, 3, 5]
myList3 = []

for i in myList1:
    myList3.append(0)
for j in range(len(myList1)):
    for k in range(len(myList2)):
        if myList1[j] == myList2[k]:
            myList3[j] = 1

print(myList3)
我的输出是我想要的:

[1, 0, 1, 0, 1]
所以我想让myList3与myList1的长度相同,并用零填充它

然后我想比较myList1和myList2,如果有匹配项,那么myList1的元素号会收到一些值


也许这没有什么问题,我找不到答案的原因是它很好?

你的方法本身没有什么问题。但是,不需要如此多的显式循环和测试:

myList1 = [1, 2, 3, 4, 5]
myList2 = [1, 3, 5]
myList3 = [1 if element in myList2 else 0 for element in myList1]
这基本上合并了遍历myList1的两个循环(一次用于0,一次用于比较),并删除了搜索myList2以查找匹配项的循环。使用这种风格通常更可取,因为它主要是关于你想要什么,而不是如何达到目的

请注意,根据您拥有的数据量,您希望
myList2
成为
集合。
集合
具有恒定的查找时间,而
列表
对于少数元素速度较快,但对于更多元素速度较慢

myList1 = [1, 2, 3, 4, 5]
mySet2 = {1, 3, 5}
myList3 = [1 if element in mySet2 else 0 for element in myList1]

你的方法没有本质上的错误。但是,不需要如此多的显式循环和测试:

myList1 = [1, 2, 3, 4, 5]
myList2 = [1, 3, 5]
myList3 = [1 if element in myList2 else 0 for element in myList1]
这基本上合并了遍历myList1的两个循环(一次用于0,一次用于比较),并删除了搜索myList2以查找匹配项的循环。使用这种风格通常更可取,因为它主要是关于你想要什么,而不是如何达到目的

请注意,根据您拥有的数据量,您希望
myList2
成为
集合。
集合
具有恒定的查找时间,而
列表
对于少数元素速度较快,但对于更多元素速度较慢

myList1 = [1, 2, 3, 4, 5]
mySet2 = {1, 3, 5}
myList3 = [1 if element in mySet2 else 0 for element in myList1]

我的意思是,从技术上讲,这一点都没有错。在myList1:
中,您对i使用
,这有点奇怪,因为您实际上并没有对任何东西使用
i
。我喜欢@Mistermiagi的答案,因为它非常简洁,但是如果你只是想寻找一种简单的方法来初始化
myList3
,你可以直接做
myList3=[0]*len(myList1)

,我的意思是,从技术上讲,这一点都没有错。在myList1:
中,您对i使用
,这有点奇怪,因为您实际上并没有对任何东西使用
i
。我喜欢@MisterMiyagi的答案,因为它非常简洁,但如果你只是想寻找一种简单的方法来初始化
myList3
,你可以只做
myList3=[0]*len(myList1)
你的代码在
O(len(myList1)*len(myList2))
时间内工作,当列表足够大时,这可能会造成问题(巧合的元素均匀分布在
myList2
)中。一个简单的优化方法是提前将
myList2
转化为一个集合:

mySet2 = frozenset(myList2)
myList3 = [1 if element in mySet2 else 0 for element in myList1]
此代码的平均运行时间将明显优于
O(len(myList1)+len(myList2))

您的代码在
O(len(myList1)*len(myList2))
时间内工作,当列表足够大时(并且重合元素均匀分布在
myList2
中),这可能会造成问题。一个简单的优化是提前将myList2
转换为一个集合:

mySet2 = frozenset(myList2)
myList3 = [1 if element in mySet2 else 0 for element in myList1]

这段代码的
O(len(myList1)+len(myList2))明显更好
平均运行时间。

您可以尝试一下。我看不出您为什么不能这样做。您没有修改任何正在迭代的列表,这很好。初始化
myList3
的快捷方式与
myList
长度相同,并填充
0
s,它是:
myList3=[0]*len(myList1)
。你可以试试。我看不出你为什么不能这样做。你没有修改你正在迭代的任何列表,这很好。初始化
myList3
的快捷方式是:
myList3=[0]*len(myList1),其长度与
myList
相同,并填充
0
s
。或者对于myList1中的元素,
myList3=[int(myList2中的元素)
。谢谢!这是从我正在编写的脚本中简化出来的,List1将是一个与此脚本共存的json,List2是一个来自api调用的json。实际的比较将是两个列表上的唯一标识符,如果存在,List3将附加一个十六进制数,而不是1。谢谢您的反馈,我我把它放在心上。或者myList3=[int(myList2中的元素)代表myList1中的元素]
。谢谢!这是从我正在编写的脚本中简化出来的,List1将是一个与此脚本共存的json,List2是一个来自api调用的json。实际的比较将是两个列表上的唯一标识符,如果存在,List3将附加一个十六进制数,而不是1。谢谢您的反馈,我我把它放在心上。