簡體   English   中英

python元組列表到嵌套列表字典的列表

[英]python list of tuples to list of dictionary of nested lists

我正在嘗試將元組列表(下面的示例z)轉換為z1。 z中的前2個項可以相同,因此成為結果字典中的公共字段。 請在下面。 也顯示了我的嘗試,但是未能對通用元素進行分組? 有什么幫助嗎?

FROM:

z= [(53, 'example 2', 2, 'instagram', 'nyc'),
    (53, 'example 2', 5, 'instagram', 'detroit'),
    (53, 'example 2', 7, 'twitter', 'harlem'),
    (50, 'example 5', 8, 'twitter', 'harlem'),
    (27, 'example 6', None, None, None), 
   ]

TO:

z1=[
 {'id':        53,
  'name':      'example 2',
  'hashtags':  [ { 'tag_id': 2, 'platform': 'instagram', 'tagname': 'nyc' },
                 { 'tag_id': 5, 'platform': 'instagram', 'tagname': 'detroit' },
                 { 'tag_id': 7, 'platform': 'twitter',   'tagname': 'harlem' },
               ]
 },
 {'id':        50,
  'name':      'example 2',
  'hashtags':  [ { 'tag_id': 8, 'platform': 'twitter', 'tagname': 'harlem' },
               ]
 },
 {'id':        27,
  'name':      'example 6',
  'hashtags':  [ { 'tag_id': None, 'platform': None, 'tagname': None },
               ]
 },
]

我的嘗試:

ld = []
for a, b, c, d, e in z:
    ld.append({ 'id':       a,
                'name':     b,
                'tag_id':   c,
                'hashtags': [{'platform': d, 'hashtag':  e}, ]
             })

print ld

輸出:

[
 {'id':        53,
  'name':      'example 2',
  'hashtags':  [ { 'tag_id': 2, 'platform': 'instagram', 'tagname': 'nyc' }]
 },
 {'id':        53,
  'name':      'example 2',
  'hashtags':  [ { 'tag_id': 5, 'platform': 'instagram', 'tagname': 'detroit' }]
 },
 {'id':        53,
  'name':      'example 2',
  'hashtags':  [ { 'tag_id': 7, 'platform': 'twitter',   'tagname': 'harlem' },]
 },
 {'id':        50,
  'name':      'example 2',
  'hashtags':  [ { 'tag_id': 8, 'platform': 'twitter', 'tagname': 'harlem' },
               ]
 },
 {'id':        27,
  'name':      'example 6',
  'hashtags':  [ { 'tag_id': None, 'platform': None, 'tagname': None },
               ]
 },
]

問題是您不希望查看是否已經向ld添加了具有給定id的字典(“我是否已將ID為53的元素添加到列表中?”)。 您需要檢查是否已添加它。

首先想到的是將以前的ID存儲在將映射到索引的字典中。 這不會增加運行時的復雜性。

ld = []
encountered_id_index = {}
for a, b, c, d, e in z:
    if a in encountered_id_index:
        index = encountered_id_index[a]
        ld_dict = ld[index]
        ld_dict['hashtags'].append({'platform': d, 'hashtag': e, 'tag_id': c})
    else:
        ld.append({ 'id': a,
                    'name': b,
                    'hashtags': [{'platform': d, 'hashtag': e, 'tag_id': c}]
        })
        index = len(ld) - 1
        encountered_id_index[a] = index

這未經測試,但我認為應該可以完成工作。

無關,但我建議將for循環中的變量名稱更改為更有意義的名稱。 “ id”代替“ a”,“ name”代替“ b”,等等。我向您保證,如果您現在學會正確地命名變量,那么將來的麻煩就更少了。 它大大提高了代碼的可讀性。

from collections import defaultdict, namedtuple

HashTag = namedtuple('HashTag', ['tag_id', 'platform', 'tag_name'])

class Entries:
    def __init__(self):
        self.entries = defaultdict(list)

    def add_entry(self, id, name, tag_id, platform, tag_name):
        key = (id, name)
        value = HashTag(tag_id, platform, tag_name)
        self.entries[key].append(value)

z1 = Entries()
for entry in z:
    z1.add_entry(*entry)

...我對此唯一不滿意的是,您需要同時知道ID 名稱才能查找條目。 如果我認真地使用了它,我將其修改為僅對id索引條目,然后再將名稱鏈接到id的第二個字典,然后實現__ getitem __,以便對id或name進行查找。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM