python列表的嵌套列表字典列表

时间:2014-02-10 23:48:50

标签: python list dictionary tuples

我正在尝试将元组列表(下面的示例z)转换为z1。 z中的前两项可以相同,因此成为结果字典中的常用字段。请在下面。我也尝试了我的尝试,但它没有将共同元素分组?有什么帮助吗?

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 },
               ]
 },
]

2 个答案:

答案 0 :(得分:3)

问题在于,您不是要查看是否已经将具有给定ID的dict添加到ld(“我是否已将ID为53的元素添加到列表中?”)。你需要检查一下你是否已经添加它。

首先想到的是将先前的id存储在映射到索引的dict中。这不会增加运行时的复杂性。

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”等。我保证如果你现在学会正确命名你的变量,你将来会有更少的麻烦。它极大地提高了代码的可读性。

答案 1 :(得分:1)

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上索引条目,然后有第二个dict将name链接到id,然后实现__ getitem __,这样它将对id或name进行查找。