Python 比较两个列表,如果第二个列表的元素出现在第一个列表中,则打印第二个列表的元素,但不要使用2 for循环

Python 比较两个列表,如果第二个列表的元素出现在第一个列表中,则打印第二个列表的元素,但不要使用2 for循环,python,list,Python,List,我必须比较两个列表,如果列表a的元素出现在列表b中,那么列表b的元素将被打印出来 a = [1, 3, 2, 1, 3] b = [2, 2, 1, 1, 1, 4, 2, 3] ans = [1, 1, 1, 3, 2, 2, 2, 1, 1, 1, 3] 我可以使用2 for循环得到答案,如: for a_ in a: for b_ in b: if a_ == b_: print b_ op: 1 1 1 3 2 2 2 1 1 1

我必须比较两个列表,如果列表
a
的元素出现在列表
b
中,那么列表
b
的元素将被打印出来

a = [1, 3, 2, 1, 3]
b = [2, 2, 1, 1, 1, 4, 2, 3]

ans = [1, 1, 1, 3, 2, 2, 2, 1, 1, 1, 3]
我可以使用2 for循环得到答案,如:

for a_ in a:
    for b_ in b:
        if a_ == b_: 
            print b_

op: 1 1 1 3 2 2 2 1 1 1 3

但是我不想对循环使用2
。如何使用单个循环完成此操作?

使用
集合。计数器为您计数:

from collections import Counter
c = Counter(b)
ans = []
for x in a:
    ans += [x]*c.get(x,0)
这是一种潜在的方法(有点混乱),只是发布它,因为事实证明制造商并没有得到正确的结果

[item for sublist in ([i] * b.count(i) for i in a) for item in sublist]
基本上,
([i]*b.count(i)for i in a)
部分构建了一个列表,但它最终是一个列表列表,所以我做了
[item for sublist in list for item in sublist]
的事情来平展列表

这可能有点类似于zondo的答案,但这会将其保留为数字列表而不是字符串。

这应该是可行的:

for a_ in a:
    if b.count(a_) :
         ans+=((str(a_)+' ')*b.count(a_)).strip().split(' ')
计数(x)计数列表中x的发生次数

您可以简单地打印n次字符串:“'mystring'次”


希望我能帮助你

@sirpasselot的可能重复项:
a
中的每个“1”(两者)都会导致打印
b
中的所有三个“1”。为什么不使用两个for循环?可以用列表替换内部循环。您可以预处理b,将元素值的字典创建为适当长度的列表,然后连接这些列表的副本。这完全取决于背景。是否明确禁止对
循环使用两个嵌套的
,或者在任何地方都不允许对
使用一次以上的
?像这样的任意限制听起来像是家庭作业,通常不止一个。。。我们还应该知道其他限制,比如不允许使用的标准库模块?@sirpasselot谢谢你的回答,但我没有得到正确的答案。得到如下输出:
2 1 2 3
。看起来a和b已切换。当我运行我的代码时,它给出了您期望的答案非常感谢@factor。这解决了我的问题。谢谢。我只是出于好奇。是否有其他方法不使用任何内置函数(如集合)?使用
+=
方法附加到列表。顺便说一句,我想给出我自己的答案,这似乎是你已经给出的。@Agsthya,就像其他人已经给出的答案一样,你可以用b.count(x)来代替。我认为效率将取决于b的大小。我想你错过了一个关键问题,那就是在单循环中获得结果。是的,我注意到了,哈哈,直到我看到主循环不能正常工作,我才打算回答。这种方法确实使用了两个循环,但它只使用其中的一个来构建列表,而另一个只是将列表展平,而不是使用
[i=j时a中i为i,b中j为i]
方法谢谢您的回答。这也在起作用。但打印结果是两次。
for a_ in a:
    if b.count(a_) :
         ans+=((str(a_)+' ')*b.count(a_)).strip().split(' ')