4

リストがあります:

data_list = ['a.1','b.2','c.3']

そして、別のリストから文字列で始まる文字列のみを取得したい:

test_list = ['a.','c.']

a.1そしてc.3返されるべきです。

二重の for ループを使用できると思います。

for data in data_list:
    for test in test_list:
       if data.startswith(test):
           # do something with item

もっとエレガントで、おそらくもっとパフォーマンスの良いものがあるのではないかと思っていました。

4

5 に答える 5

13

str.startswithプレフィックスのタプル(リストではない) を取ることもできます:

test_tuple=tuple(test_list)
for data in data_list:
    if data.startswith(test_tuple):
        ...

これは、単純なリスト内包表記でフィルタリングされたリストが得られることを意味します。

matching_strings = [ x for x in data_list if x.startswith(test_tuple) ]

またはへの呼び出しfilter:

import operator
f = operator.methodcaller( 'startswith', tuple(test_list) )
matching_strings = filter( f, test_list )
于 2013-06-09T00:10:20.467 に答える
3

ラムダ関数filterと: _startswith

data_list = ['a.1','b.2','c.3']
test_list = ('a.','c.')

result = filter(lambda x: x.startswith(test_list), data_list)

print(list(result))

出力:

['a.1', 'c.3']
于 2013-06-09T00:14:34.823 に答える
2

次のことを試してください。

for data in data_list:
    if any(data.startswith(test) for test in test_list):
        # do something

any()iterable を受け取り、Truebool が true である iterable からの最初の値を返すビルトインですFalse。私の例では、リストを作成する代わりにジェネレーター式を使用しています (これは無駄です)。

于 2013-06-09T00:08:32.997 に答える
1

python docs でfilteranyをチェックしてください。

>>> data_list = ['a.1','b.2','c.3']
>>> test_list = ['a.','c.']
>>> new_list = filter(lambda x: any(x.startswith(t) for t in test_list), data_list)
>>> new_list
['a.1', 'c.3']

次に、new_list.

@Chepner が指摘しているように、文字列のタプルを に指定することstartswithもできるため、上記も次のように記述できます。

>>> data_list = ['a.1','b.2','c.3']
>>> test_tuple = ('a.','c.')
>>> new_list = filter(lambda x: x.startswith(test_tuple), data_list)
>>> new_list
['a.1', 'c.3']
于 2013-06-09T00:09:04.260 に答える