1

私は python itertools を学ぼうとしています (今のところ気に入っています!) が、問題が発生しました。次の 2 つのリストがあります。

a=["http://www.xyz.com/jhuh7287", "http://www.hjuk.com/kashjh716", "http://www.psudjg.com/9279jshkoh", "http://www.xyz.com/jhuh7287",  "http://www.xyz.com/9289jhjbg"]
data=["k","some small string here", "so med string here", "some string here","l"]
tempstring="http://www.xyz.com"

最初に、私が望んでいたのは、特定の長さを下回るすべての文字列の data[i] を削除し、その後 a. このために、次のようなものを使用しました。

iselectors = [x is not len(str(x))>1 for x in data]
data=list(itertools.compress(data, iselectors))
a=list(itertools.compress(a, selectors))

..これはうまくいきます。ここで、iselector に別の条件を追加する必要があります。これは、「tempstring が a[i] にある」場合と len(str(x))>1..

だから、私は次のようなことを試しました:

iselectors = [tempstring in a and x is not len(str(x))>1 for x in data]

...しかし、「tempstring in a」を使用するときに a 全体を反復しているとは思わないため、これが正しいかどうかはわかりません

どんなガイダンスでも大歓迎です。ありがとう。

4

2 に答える 2

2

両方を同時に繰り返す必要があると思います

iselectors = [len(str(x))>1 and tempstring in y for x,y in zip(data,a)]
于 2012-11-23T13:50:02.693 に答える
2

最も簡単な方法は、次のように処理することです。

>>> pprint(zip(data, a))
[('k', 'http://www.xyz.com/jhuh7287'),
 ('some small string here', 'http://www.hjuk.com/kashjh716'),
 ('so med string here', 'http://www.psudjg.com/9279jshkoh'),
 ('some string here', 'http://www.xyz.com/jhuh7287'),
 ('l', 'http://www.xyz.com/9289jhjbg')]

>>> [ (av, dv) for av, dv in zip(a, data) if len(av) > 1 and tempstring in av]
[('http://www.xyz.com/jhuh7287', 'k'), ('http://www.xyz.com/jhuh7287', 'some string here'), ('http://www.xyz.com/9289jhjbg', 'l')]

少しリファクタリングすると、次のようになります。

selectors = (tempstring in dv for av, dv in izip(a, data) if len(av) > 1)

そして、@mgilsonが重要なポイントで彼の回答を削除したので、OPが参加したことを願っています。この回答に彼の言葉遣いを再投稿します。

また、isオブジェクト ID の比較にも使用されます。このチェックは Cpython の小さな整数 (1 は len(str(1))) に対して機能しますが、他の python 実装での動作は保証されていません (また、将来の Cpython での動作も保証されていません)。len(str(x))>1 が欲しいだけだと思います。

于 2012-11-23T13:50:42.163 に答える