我正在嘗試用 Python 開發一個小腳本,但我從未使用過這種語言。
我有一個類似這樣的結構:
dict = [
{ "id" : 1,
"people" : [ { "name" : "Sarah",
"surename" : "something"
},
{ "name" : "Luke",
"surename" : "something"
},
{ "name" : "Chris",
"surename" : "something"
}
]
},
{ "id" : 2,
"people" : [ { "name" : "Jhon",
"surename" : "something"
},
{ "name" : "Luke",
"surename" : "something"
},
{ "name" : "Ronald",
"surename" : "something"
}
]
}
]
我還有另一個值串列,例如name_list = ["Sarah", "Luke"].
我需要找到結構的所有 ID,以便 中的所有名稱name_list都出現在字典串列中people。
我試過這樣的事情,但這不起作用。
for person in dict:
if all(name_list in p["name"] for p in person["people"]):
# Do something with person["id"]
找到包含name_list 的所有名稱的字典串列的所有 ID 對我來說很重要。
uj5u.com熱心網友回復:
ids = [item['id'] for item in d if all(name in [person['name'] for person in item['people']] for name in name_list)]
print(ids)
>>> [1]
uj5u.com熱心網友回復:
首先,dict是一個內置函式,隱藏它可能會在以后為您破壞某些東西(例如,isinstance(obj, dict)不起作用)。
假設您的輸入存盤在data變數中:
result = [
d["id"]
for d in data
if not set(name_list) - {p['name'] for p in d['people']}
]
這{p['name'] for p in d['people']}是一個set comprehension. 結果將是peoplestruct的唯一名稱集,例如{Sarah, Luke, Ronald}.
然后,我們用差集找到這名未在name_list:set(name_list) - {Sarah, Luke, Ronald} == set()。
如果 name_list 中的所有名稱都在people結構中,則差異將等于一個空集。
所以我們的目標是找到這種差異將是一個空集的結構。
set算術將比使用in帶串列的運算子快得多。
In [1]: %timeit [item['id'] for item in d if all(name in [person['name'] for person in item['people']] for name in name_list)]
1.43 μs ± 17.5 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
In [2]: %timeit [d["id"] for d in data if not set(name_list) - {p['name'] for p in d['people']}]
869 ns ± 2.64 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/350539.html
