0

2 人が辞書にある場合、人の「名前」に関連付けられた「id」を調べるにはどうすればよいですか?

user = 'PersonA'
id = ? #How do I retrieve the 'id' from the user_stream json variable?

json、「user_stream」という名前の変数に保存されます

[
  {
    'name': 'PersonA',
    'id': '135963'
  },
  {
    'name': 'PersonB',
    'id': '152265'
  },
]
4

3 に答える 3

2

JSON 構造をデコードし、一致するものが見つかるまですべての辞書をループする必要があります。

for person in json.loads(user_stream):
    if person['name'] == user:
        id = person['id']
        break
else:
    # The else branch is only ever reached if no match was found
    raise ValueError('No such person')

複数のルックアップを行う必要がある場合は、dictルックアップを容易にするために、この構造を に変換することをお勧めします。

name_to_id = {p['name']: p['id'] for p in json.loads(user_stream)}

次に、id直接検索します。

id = name_to_id.get(name)  # if name is not found, id will be None

上記の例では、名前が一意であると想定しています。そうでない場合は、次を使用します。

from collections import defaultdict

name_to_id = defaultdict(list)
for person in json.loads(user_stream):
    name_to_id[person['name']).append(person['id'])

# lookup
ids = name_to_id.get(name, [])  # list of ids, defaults to empty

これはいつものようにトレードオフであり、速度のためにメモリをトレードオフします。

于 2012-11-28T15:22:58.623 に答える
1

Martijn Pieters の解決策は正しいですが、そのような検索を何度も行う場合は、json を読み込んで、すべての検索に対してではなく、1 回だけ反復処理することをお勧めします。

name_id = {}

for person in json.loads(user_stream):
    name = person['name']
    id = person['id']
    name_id[name] = id

user = 'PersonA'
print name_id[user]
于 2012-11-28T15:28:35.823 に答える
0
persons = json.loads(...)
results = filter(lambda p:p['name'] == 'avi',persons)
if results:
    id = results[0]["id"]

resultsもちろん、1つ以上にすることもできます..

于 2012-11-28T15:29:25.550 に答える