此脚本可以满足我的需要,但是在研究如何实现此目的时,我发现很多评论认为这样做是错误的方式。我发现的注释不是很具描述性,并且似乎并不适用于我的用例。我不能指责是否或为什么这是错误的,该如何改善呢?
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的元素编号将获得一些值。
也许这没什么问题,而我找不到答案的原因是那还好吗?
答案 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
成为set
。 set
的查找时间是恒定的,而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)
。