2

文字列のリストが 2 つあるとします。

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

ここで、#### は 4 桁の乱数を表します。と

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

list のどの文字列エントリにaの特定のエントリが含まれているかを知る必要がありますb。ネストされたループをいくつか使用してこれを達成し、in演算子を使用して文字列に b の現在のエントリが含まれていることを確認しました。しかし、py に比較的慣れていないので、これは最も Pythonic またはエレガントな記述方法ではなかったとほぼ確信しています。それで、私の解決策を減らすためのそのようなイディオムはありますか?

4

5 に答える 5

5

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']
>>> a_sep = [x.split('/')[1] for x in a]
>>> idxs = [i for i, x in enumerate(a_sep) if x in b]
>>> idxs
[0, 3]
>>> [a[i] for i in idxs]
['####/boo', '####/bii']

インデックスの代わりに要素を直接取得したい場合:

>>> a = ['####/boo', '####/baa', '####/bee', '####/bii', '####/buu']
>>> b = ['boo', 'aaa', 'bii']
>>> [x for x in a if x.split('/')[1] in b]
['####/boo', '####/bii']
于 2012-05-07T20:34:47.310 に答える
2

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が、 が の場合set、多数の要素のパフォーマンスが向上します。

于 2012-05-07T20:40:11.393 に答える
1

他の回答が示しているように、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']
于 2012-05-07T20:49:18.283 に答える
1
>>> [i for i in a for j in b if j in i]
['####/boo', '####/bii']

これは、エレガントでpythonicな、あなたが望むことをするはずです。

于 2012-05-07T20:38:39.507 に答える
1
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']

または、エントリ全体が必要な場合:

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

プリント:

['3768/boo', '9110/bii']
于 2012-05-07T20:42:11.520 に答える