在For循环中更改List元素

时间:2018-11-19 21:34:32

标签: 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 range(len(myList2)):
        if myList1[j] == myList2[k]:
            myList3[j] = 1

print(myList3)

我的输出就是我想要的:

[1, 0, 1, 0, 1]

所以我想使myList3与myList1的长度相同,并用零填充它。

然后我想将myList1与myList2进行比较,如果存在匹配项,那么myList1的元素编号将获得一些值。

也许这没什么问题,而我找不到答案的原因是那还好吗?

3 个答案:

答案 0 :(得分:1)

您的方法天生没有错。但是,不需要这么多的显式循环和测试:

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成为setset的查找时间是恒定的,而list的查找速度很快,但元素较少。

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

答案 1 :(得分:1)

您的代码在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))

答案 2 :(得分:0)

从技术上讲,这根本没有错。您正在使用for i in myList1:有点奇怪,因为您实际上并没有使用i。就其简洁程度而言,我喜欢@MisterMiyagi的答案,但如果您只是在寻找一种简单的初始化myList3的方法,那么您只需完成myList3 = [0]*len(myList1)