Python中的交叉列表理解

2024-10-03 04:33:11 发布

您现在位置:Python中文网/ 问答频道 /正文

假设我有两个字符串列表:

a = ['####/boo', '####/baa', '####/bee', '####/bii', '####/buu']

其中#####表示4位随机数。以及

b = ['boo', 'aaa', 'bii']

我需要知道列表a中的哪个字符串条目包含b中的任何给定条目。我可以通过两个嵌套循环来完成这一点,然后使用in运算符检查字符串是否包含b中的当前条目。但是,作为py的新手,我几乎肯定这不是最具python风格或最优雅的编写方法。那么,有没有这样的成语来减少我的解决方案呢?在


Tags: 字符串inpy列表风格条目运算符嵌套循环
3条回答

下面的代码为您提供了一个索引为a的数组,其中斜杠后面的部分是来自b的元素。在

a_sep = [x.split('/')[1] for x in a]
idxs = [i for i, x in enumerate(a_sep) if x in b]

要提高性能,请将b设为集合而不是列表。在

演示:

^{pr2}$

如果您希望直接获取元素而不是索引:

>>> a = ['####/boo', '####/baa', '####/bee', '####/bii', '####/buu']
>>> b = ['boo', 'aaa', 'bii']
>>> [x for x in a if x.split('/')[1] in b]
['####/boo', '####/bii']

ThiefMaster的答案很好,我的答案也很相似,但是如果你不需要知道索引,你可以走捷径:

>>> a = ['####/boo', '####/baa', '####/bee', '####/bii', '####/buu']
>>> b = ['boo', 'aaa', 'bii']
>>> [x for x in a if x.split('/')[1] in b]
['####/boo', '####/bii']

同样,如果bset,这将提高大量元素的性能。在

import random
a=[str(random.randint(1000,9999))+'/'+e for e in ['boo','baa','bee','bii','buu']]

b = ['boo', 'aaa', 'bii']

c=[x.split('/')[-1] for x in a if x.split('/')[-1] in b]

print c

印刷品:

^{pr2}$

或者,如果您想要整个条目:

print [x for x in a if x.split('/')[-1] in b]

印刷品:

['3768/boo', '9110/bii']

相关问题 更多 >