我一直在嘗試從一個python查詢中重新格式化一些json資料。我想讓我的資料的slug成為一個字典的key。我做到了,但我有一個串列和一個字典在外面。我怎樣才能洗掉它們呢?我希望有這樣的結果:
{
"corps-necte" :{
"id": 9666888,
"title": "Corps connectu00e9",
"slug": "corps-necte",
},
"portal-thanos" : {
"id": 9666888,
"title": "Portal thanos",
"slug": "portal-thanos",
},...
}
但實際上我有這樣的:
[
{
"corps-necte" :{
"id": 9666888,
"title": "Corps connectu00e9",
"slug": "corps-necte",
},
},
{
"portal-thanos" : {
"id": 9666888,
"title": "Portal thanos",
"slug": "portal-thanos",
}
}...
這是我獲得上述資料的方法,也許有一個更簡單的方法,我可以正確地重新排列我的查詢?
def artist_artworks(self, artist_id)。
藝術家 = self.artist(artist_id)
藝術品 = []
with ThreadPool(self.threads) as pool:
for artwork in pool.imap(self.artwork, artist["projects"]) 。
keyList = [artwork["slug"]]
valueList = [artwork]
artworks.append(dict(list(zip(keyList, valueList)))))
continue(keyList, valueList)
break
return artworks
def save_artists_json(self, artist)。
result = self.save_artist(artist)
json_formatted_str = json.dumps(result)
return json_formatted_str
謝謝你
uj5u.com熱心網友回復:
你可以只做:
from pprint import pprint
x = [
{
"corps-necte" :{
"id": 9666888,
"title": "Corps connectu00e9",
"slug": "corps-necte",
},
},
{
"portal-thanos" : {
"id": 9666888,
"title": "Portal thanos",
"slug": "portal-thanos",
}
}
]
y = {k: v for d in x for k, v in d.items()> }
pprint(y)
{'corps-connecte': {'id': 9666888,
'slug': 'corps-necte',
'title': 'Corps connecté'}。
'portal-thanos'/span>: {'id'/span>: 9666888,
'slug': 'portal-thanos',
'title': 'Portal thanos'}}。
uj5u.com熱心網友回復:
我認為你的錯誤在于讓artworks成為一個串列并附加到它,而不是讓它成為一個dict并以新的藝術作品來更新它:
def artist_artworks(self, artist_id)。
藝術家 = self.artist(artist_id)
Artworks = {} # <- Initialize as dictionary: artist = self.artist(artist_id).
with ThreadPool(self.threads) as pool:
for artwork in pool.imap(self.artwork, artist["projects"]) 。
keyList = [artwork["slug"]]
valueList = [artwork]
artworks.update(dict(list(zip(keyList, valueList))))) # <- update items(keyList, valueList)
繼續
break
return artworks
def save_artists_json(self, artist)。
result = self.save_artist(artist)
json_formatted_str = json.dumps(result)
return json_formatted_str
uj5u.com熱心網友回復:
另一種單行的解決方案(但可能效率更低):
{next(iter(e)) 。e[next(iter(e))] for e in L}。
在Python 3.8中使用walrus :=運算子的優化版本:
{(k := next(iter(e))。e[k] for e in L}。
也可能是更有效的版本:
dict(e.popitem() fore in L)
根據評論中的建議,上述的更優化版本:
dict(map(dict.popitem, L)
對不同的選項進行計時(在Mac OS Big Sur上運行,venv與Python 3.9.0)
from pprint import pprint
from timeit import timeit
from copy import deepcopy
x = [
{
"corps-necte" :{
"id": 9666888,
"title": "Corps connectu00e9",
"slug": "corps-necte",
},
},
{
"portal-thanos" : {
"id": 9666888,
"title": "Portal thanos",
"slug": "portal-thanos",
}
}
]
# 0.947[/span
print('Items: ,
timeit('L = [z.copy() for z in x]; {k: v for e in L for k, v in e.items()}'/span>,
globals=globals())
# 0.827[/span]。
print('Next -> Iter: ',
timeit('L = [z.copy() for z in x]; {(k := next(iter(e))): e[k] for e in L}'/span>,
globals=globals())
# 0.912[/span]。
print('PopItem: '/span>,
timeit('L = [z.copy() for z in x]; dict(e.popitem() for e in L)'/span>,
globals=globals())
# 0.734[/span]。
print('Map -> PopItem: '/span>,
timeit('L = [z.copy() for z in x]; dict(map(dict.popitem, L))',
globals=globals())
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/325370.html
標籤:
上一篇:如何將專案添加到串列中?翩翩起舞
