1

2つのリストがあります

Experimental = ["2311","1441","31","233122"]
Reference = ["asasa2311","dadewr1441","app"]

私がやりたいのは、Experimentalの要素が、Referenceの要素のサブストリングと一致する場合、一致する要素をExperimentalの新しいリストに配置することです。

したがって、新しいリストは

["2311","1441","31"]

私がやってみたのは

[i for i in Experimental if any(sub in i for sub in Reference)]
4

3 に答える 3

1

31の部分文字列である一致も生成されたため、質問を明確にできますかasasa1311

In [516]: Experimental = ["2311","1441","31","233122"]
     ...: Reference = ["asasa2311","dadewr1441","app"]
     ...: 

In [517]: [i for i in Experimental for x in Reference if i in x ]
Out[517]: ['2311', '1441', '31']
于 2012-10-20T07:13:06.887 に答える
1

問題の説明が期待される出力と一致しません。「サブ文字列」と言いますが、期待される出力31には、のサブ文字列であっても含まれていませんasasa1311。これを行う1つの方法は次のとおりです。

>>> e = ["2311","1441","31","233122"]
>>> r = ["asasa2311","dadewr1441","app"]
>>> [eelem for relem in r for eelem in e if eelem in relem]
['2311', '31', '1441']

または、期待される出力が必要な場合:

>>> e = ["2311","1441","31","233122"]
>>> r = ["asasa2311","dadewr1441","app"]
>>> [eelem for relem in r for eelem in e if relem.endswith(eelem)]
['2311', '1441']

または、最初の一致でブレークアウトするのをもう少し効率的にしたい場合は、ジェネレーターアプローチを使用します。

>>> e = ["2311","1441","31","233122"]
>>> r = ["asasa2311","dadewr1441","app"]
>>> [eelem for eelem in e if any(r if eelem in relem else False for relem in r)]
['2311', '1441', '31']

inまたは、ブール値を返すという事実を使用する場合は、もう少し短くします。

>>> [eelem for eelem in e if any(eelem in relem for relem in r)]
['2311', '1441', '31']
于 2012-10-20T07:15:03.773 に答える
1

ここで使用する必要がありregexます:

In [20]: e=["2311","1441","31","233122"]

In [21]: r=["asasa2311","dadewr1441","app"]

In [22]: [x for x in e if any(x in re.findall("\d+",y) for y in r)]
Out[22]: ['2311', '1441']
于 2012-10-20T07:18:29.667 に答える