+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

暂无数据

根据另一个列表中的出现将项目追加到列表中

发布于2020-06-01 21:54     阅读(722)     评论(0)     点赞(9)     收藏(2)


所以我有一个清单:

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_list1in 中每个元素的下一个出现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"]]

因此,再次,我需要的是每次迭代仅附加项中的下一次出现my_list2

我是Python的新手,所以请保持谨慎。我非常感谢您的任何建议!


解决方案


您的代码有一些问题,但是逻辑基本上是正确的。您只需要做两件事就可以了:

1)追加时打破循环。

2)删除附加的项目(因此以后不再添加)

您可以采用以下一种方法:

# 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']]

您构建一个Counter来计算中每个“键”的出现my_list1然后,您遍历my_list2并检查密钥是否存在于计数器中,并且计数是否大于0。如果是,则将该项目添加到列表中并减少计数器。



所属网站分类: 技术文章 > 问答

作者:黑洞官方问答小能手

链接: https://www.pythonheidong.com/blog/article/400994/

来源: python黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

9 0
收藏该文
已收藏

评论内容:(最多支持255个字符)