給定一個元組串列,例如
[(1, 'Japan', 1, 'Tokyo'), (1, 'Japan', 2, 'Osaka'), (2, 'Korea', 1, 'Seoul',), (2, 'Korea', 2, 'Pyongyang')]
# country_id, country_name, city_id, city_name
我希望將其結構化為:
{
'countries': [
{
'country_id': 1,
'country_name': 'Japan',
'cities': [
{
'city_id': 1,
'city_name': 'Tokyo'
},
{
'city_id': 2,
'city_name': 'Osaka'
}
]
},
{
'country_id': 2,
'country_name': 'Korea',
'cities': [
{
'city_id': 1,
'city_name': 'Seoul'
},
{
'city_id': 2,
'city_name': 'Pyongyang'
}
]
}
]
}
我實作了這個并且效果很好,但不是 Pythonic。想知道這是否可以大大改進/加速,因為這形成了 API 的回應。
x = [(1, 'Japan', 1, 'Tokyo'), (1, 'Japan', 2, 'Osaka'), (2, 'Korea', 1, 'Seoul'), (2, 'Korea', 2, 'Pyongyang')]
countrylist = []
query_countries = []
for a in x:
if a[0] not in countrylist:
query_countries.append((a[0], a[1]))
countrylist.append(a[0])
countrylist = list(set(countrylist))
countries = [{'country_id': r[0], 'country_name': r[1], 'cities': []} for r in query_countries]
for r in x:
countries[countrylist.index(r[0])]['cities'].append({'city_id': r[2], 'city_name': r[3]})
final = {'countries': countries}
print(final)
#{'countries': [{'country_id': 1, 'country_name': 'Japan', 'cities': [{'city_id': 1, 'city_name': 'Tokyo'}, {'city_id': 2, 'city_name': 'Osaka'}]}, {'country_id': 2, 'country_name': 'Korea', 'cities': [{'city_id': 1, 'city_name': 'Seoul'}, {'city_id': 2, 'city_name': 'Pyongyang'}]}]}
uj5u.com熱心網友回復:
運算式a[0] not in countrylist
和countrylist.index(r[0])
不是最有效countrylist
的,串列也是如此,這些操作需要掃描串列。在某些時候,您將它變成一個集合,但您可能已經決定從頭到尾都使用一個集合,然后這些查找操作可以在恒定時間內完成(平均而言)。這已經可以提高大型輸入的性能。
對于這種挑戰,groupby
似乎itemgetter
是很好用的工具。它們允許使用一個運算式完成作業:
data = [(1, 'Japan', 1, 'Tokyo'), (1, 'Japan', 2, 'Osaka'), (2, 'Korea', 1, 'Seoul',), (2, 'Korea', 2, 'Pyongyang')]
from itertools import groupby
from operator import itemgetter
result = [
{
"country_id": country_id,
"country_name": country_name,
"cities": [
{
"city_id": city_id,
"city_name": city_name
} for *_, city_id, city_name in cities
]
} for (country_id, country_name), cities in groupby(data, itemgetter(0, 1))
]
print(result)
groupby
你可以想象這個groupby
呼叫回傳這個結構:
[
(1, 'Japan'), [
(1, 'Japan', 1, 'Tokyo'),
(1, 'Japan', 2, 'Osaka')
],
(2, 'Korea'), [
(2, 'Korea', 1, 'Seoul'),
(2, 'Korea', 2, 'Pyongyang')
]
]
...除了串列不是串列而是迭代器。但是對于for ... in
沒有區別的語法。
內部元組只是對原始資料的參考,而外層(組)中的值由 產生itemgetter
,它產生前兩個值的元組。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/469292.html