Skip to main content
 首页 » 编程设计

python之根据另一个列表中的出现将项目 append 到列表

2025年05月04日20Terrylee

所以我有一个列表:

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。如果存在,则将项目添加到列表并减少计数器。