2

これはおそらく簡単な質問ですが、自分で簡単な答えを見つけることができませんでした.

2 つのリストが与えられた場合、1 つは ID のリストのみ、もう 1 つはすべてのデータ (気にしない ID を含む) を含みます。
all_data = [['abc', 123], ['cde', 234], ['fgh', 345]]
ids = ['abc', 'fgh']

次の出力を取得する最良の方法は何ですか。同じ ID を持つものだけが保持されることに注意してください。 new_data = [['abc', 123], ['fgh', 345]]

私の現在のコードは次のようなことをします:

for x in all_data:
    for y in ids:
         if x[0] == y:
              new_data.append(x)

別の方法で何をしますか?どこかで見逃したこれを処理する組み込み関数はありますか?

(実際にはセットとそのすべてを含む非常に長いシーケンスであるため、「何かのような」と言います。そのため、共有する「pythonic」ワンライナーがないのです。)

更新:まあ、皆さんは楽しいです。

もう少し辛くしてみたらどうですか。"all_data" の代わりに、"all_data" と同じ形式のリスト エントリがいくつかある辞書 all_data_dict がある場合はどうなりますか? ルールに従って、元の質問への回答を受け入れるようにしますが、楽しみに遅れないようにしたい場合は、何が得られるか見てみましょう!

4

5 に答える 5

7

条件がセット内のメンバーシップをチェックするリスト内包表記を使用します。

>>> all_data = [['abc', 123], ['cde', 234], ['fgh', 345]]
>>> ids = ['abc', 'fgh']
>>> id_set = set(ids)
>>> [s for s in all_data if s[0] in id_set]
[['abc', 123], ['fgh', 345]]
于 2012-08-09T21:40:14.660 に答える
7

コメントの後に編集しましたが、セットを使用するつもりでした。レイモンドが彼の答えで示唆しているように、IDのセットでリスト内包表記を使用してください:)。

all_data = [['abc', 123], ['cde', 234], ['fgh', 345]]
ids = set(['abc', 'fgh'])
filtered_data = [x for x in all_data if x[0] in ids]
于 2012-08-09T21:40:41.510 に答える
2

all_data次のように使用するため、辞書に変換する必要があります。

d = dict(all_data)
new_data = [(k, d[k]) for k in ids]

これは、で指定されidsた順序ではなく、で指定された順序を使用しall_dataます。

于 2012-08-09T21:40:57.833 に答える
2

多くの人がdictsまたはLCを使用しているので、私が示すべきだと思いましたfilter

>>> all_data = [['abc', 123], ['cde', 234], ['fgh', 345]]    
>>> ids = set(['abc', 'fgh'])
>>> values = filter(lambda value: value[0] in ids, all_data)
>>> values
[['abc', 123], ['fgh', 345]]
>>> 

第二部について。

>>> all_data_dict = {'abc':all_data, 'cde':all_data, 'fgh':all_data}
>>> ids = set(['abc', 'fgh'])
>>> dict(filter(lambda value: value[0] in ids, all_data_dict.items()))
{'abc': [['abc', 123], ['cde', 234], ['fgh', 345]], 'fgh': [['abc', 123], ['cde', 234], ['fgh', 345]]}
于 2012-08-09T21:45:34.643 に答える
0

2 番目の質問は難しくありません。最初からデータを構造化する適切な方法です。

>>> all_data = {'abc': 123, 'cde': 234,'fgh': 345}  # a dict
>>> ids = {'abc', 'fgh'}  # a set
>>> {k:v for k,v in all_data.viewitems() if k in ids}
{'abc': 123, 'fgh': 345}

ちなみに、一致するキーをすばやく取得する方法は次のとおりです。

>>> all_data.viewkeys() & ids 
set(['abc', 'fgh'])
于 2012-08-14T09:00:42.453 に答える