所以我有一个列表:
my_list1 = ["p1", "p2", "p4", "p1"]
我还有另一个包含子列表的列表:
my_list2 = [[1,"p1"], [1,"p2"], [1,"p3"], [1,"p4"], [2, "p1"], [2, "p2"], [2, "p3"], [2, "p4"]]
现在我要做的是: 我想遍历 my_list1 然后遍历 my_list2 并创建一个新列表,其中包含 my_list1 的每个元素在 中的下一次出现my_list2.
即我想要获得的是:
new_list = [[1, "p1"], [1, "p2"], [1, "p4"], [2, "p1"]]
我已经尝试过以下方法:
new_list = []
for i in my_list1:
for j in my_list2:
if i in j[1]:
new_list.append(j)
这给了我
new_list = [[1,"p1"], [1,"p2"], [1,"p4"], [2, "p1"], [2, "p2"], [2, "p4"]]
因此,再次强调,我需要的是每次迭代仅 append my_list2 中某项的下一次出现。
我是 Python 的新手,所以请保持温柔。我非常感谢任何建议!
请您参考如下方法:
你的代码有一些问题,但逻辑基本正确。您只需要以不同的方式做两件事:
1) 追加时跳出循环。
2) 删除 append 的项目(这样你以后就不会再 append 它)
这是您可以采用的一种方法:
# create a copy of my_list2 because calling pop will mutate the list
temp_list2 = [x for x in my_list2]
new_list = []
for i,x in enumerate(my_list1):
for j,y in enumerate(temp_list2):
if x == y[1]:
new_list.append(temp_list2.pop(j))
break
print(new_list)
#[[1, 'p1'], [1, 'p2'], [1, 'p4'], [2, 'p1']]
此外,不要使用 in 来比较值,而是使用 ==。
这是使用 collections.Counter 的另一种更有效的方法:
from collections import Counter
list1_counter = Counter(my_list1)
new_list = []
for (value, key) in my_list2:
if key in list1_counter and list1_counter[key] > 0:
new_list.append([value, key])
list1_counter[key] -= 1
print(new_list)
#[[1, 'p1'], [1, 'p2'], [1, 'p4'], [2, 'p1']]
您构建了一个计数器 来计算my_list1 中每个“键”的出现次数。然后迭代 my_list2 并检查该键是否存在于计数器中并且计数是否大于 0。如果存在,则将项目添加到列表并减少计数器。
