Python中的交叉列表理解

Python中的交叉列表理解,python,list-comprehension,Python,List Comprehension,假设我有两个字符串列表: a=[“#########/boo”、“#####/baa”、“#######/bii”、“######/buu” 其中#####表示4位随机数。及 b=['boo','aaa','bii'] 我需要知道列表a中的哪个字符串条目包含b中的任何给定条目。我可以通过两个嵌套循环来完成这项工作,然后使用in操作符来检查字符串是否包含b中的当前条目。但是,作为py的新手,我几乎可以肯定这不是最具Python风格或优雅的写作方式。那么,有没有这样的成语来减少我的解决方案呢 下面的

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

a=[“#########/boo”、“#####/baa”、“#######/bii”、“######/buu”

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

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


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

下面的代码为您提供了一个索引为
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
设置为一个集合而不是列表

演示:


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

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

这应该是你想要的,优雅的和pythonic的。

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

>>> a = ['####/boo', '####/baa', '####/bee', '####/bii', '####/buu']
>>> b = ['boo', 'aaa', 'bii']
>>> [x for x in a if x.split('/')[1] in b]
['####/boo', '####/bii']
同样,如果
b
集合
,这将提高大量元素的性能

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
印刷品:

['boo', 'bii']
['3768/boo', '9110/bii']
或者,如果需要整个条目:

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

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

正如其他答案所指出的,您可以使用set操作来加快速度。以下是一种方法:

>>> a_dict = dict((item.split('/')[1], item) for item in a)
>>> common = set(a_dict) & set(b)
>>> [a_dict[i] for i in common]
['####/boo', '####/bii']

嘿,泰文。当我使用嵌套循环声明和比较时,我知道我不够简洁和通俗。我一直在考虑(反)通俗的
in
操作符。如果我在这里偏离了底线,请原谅,但py的宗旨之一不是要避免混淆和歧义吗?为什么对列表理解和字符串使用相同的运算符作为实现“字符串a包含b作为子字符串”的方法我认为从上下文来看,如果是迭代或包含检查,这是非常明显的。想象一下,你不知道
a
b
的内容或性质,我们不需要
split
,那条语句可以读
[x代表x,如果x代表b]
,我不知道,但这让我觉得很奇怪:)这似乎并没有太多的表现力或明确性。双嵌套for循环加上列表中的条件?不太可读。我读它的方式是“一个列表,其中包含A中的i和b中的j,如果i包含j”。似乎有道理。但我想我在可读性方面是少数派。我认为如果使用更好的变量名,它的可读性就足够了。然而,中的
在技术上并不完全是正确的测试。如果
a
中的斜杠后面有重复的元素,则会遗漏一些。事实上,元素的数量也不是很小。