首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >特定列表格式Python

特定列表格式Python
EN

Stack Overflow用户
提问于 2018-04-25 08:15:53
回答 5查看 85关注 0票数 4

我研究了很多类似的问题,但似乎找不到解决办法。我想要实现的是获得两本这种形式的词典,每一本:

代码语言:javascript
复制
{'apple': ['5', '65'], 'blue': ['9', '10', '15', '43'],
'is': ['5', '6', '13', '45', '96'], 'yes': ['1', '2', '3', '11'], 
'zone': ['5', '6', '9', '10', '12', '14', '18', '19', '29', '45']}

{'apple': ['43'], 'appricote': ['1', '2', '3', '4', '5', '6'],
'candle': ['1', '2', '4', '5', '6', '9'], 'delta': ['14', '43', '47'], 
'dragon': ['23', '24', '25', '26'], 'eclipse': ['11', '13', '15', '19'], 
'island': ['1', '34', '35']}

我想要用以下的格式:

代码语言:javascript
复制
apple ['5', '43', '65']
apricot ['1', '2', '3', '4', '5', '6']
blue ['9', '10', '15', '43']
candle ['1', '2', '4', '5', '6', '9']
delta ['14', '43', '47']
dragon ['23', '24', '25', '26']
eclipse ['11', '13', '15', '19']
is ['5', '6', '13', '45', '96']
island ['1', '34', '35']
yes ['1', '2', '3', '11']
zone ['5', '6', '9', '10', '12', '14', '18', '19', '29', '45']

但这是我得到的格式:

代码语言:javascript
复制
apple [['5', '65'], ['43']]
blue [['9', '10', '15', '43']]
is [['5', '6', '13', '45', '96']]
yes [['1', '2', '3', '11']]
zone [['5', '6', '9', '10', '12', '14', '18', '19', '29', '45']]
appricote [['1', '2', '3', '4', '5', '6']]
candle [['1', '2', '4', '5', '6', '9']]
delta [['14', '43', '47']]
dragon [['23', '24', '25', '26']]
eclipse [['11', '13', '15', '19']]
island [['1', '34', '35']]

到目前为止,这是我的代码

代码语言:javascript
复制
def merge_dictionaries(dict1, dict2): 
    from itertools import chain
    from collections import defaultdict

    dict3 = defaultdict(list)
    for k, v in chain(dict1.items(), dict2.items()):
        dict3[k].append(v)

    for k, v in dict3.items():
        print(k, v)

因此,我的问题是,我是否应该进一步处理我现在的格式,还是有可能立即实现我想要的格式。例如,如果您告诉我处理我已经实现的格式,我可以将子列表合并为每个键的一个列表,然后排序,以及对键进行排序。但我想知道是否有更直接的方法。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2018-04-25 08:30:40

这里有一种没有collections的方法。其思想是迭代字典键的联合,然后使用dict.get的默认参数。

代码语言:javascript
复制
d1 = {'apple': ['5', '65'], 'blue': ['9', '10', '15', '43'],
      'is': ['5', '6', '13', '45', '96'], 'yes': ['1', '2', '3', '11'], 
      'zone': ['5', '6', '9', '10', '12', '14', '18', '19', '29', '45']}

d2 = {'apple': ['43'], 'appricote': ['1', '2', '3', '4', '5', '6'],
      'candle': ['1', '2', '4', '5', '6', '9'], 'delta': ['14', '43', '47'], 
      'dragon': ['23', '24', '25', '26'], 'eclipse': ['11', '13', '15', '19'], 
      'island': ['1', '34', '35']}

res = {}

for key in set().union(*(d1, d2)):
    res[key] = sorted(d1.get(key, []) + d2.get(key, []), key=int)

结果:

代码语言:javascript
复制
{'apple': ['5', '43', '65'],
 'appricote': ['1', '2', '3', '4', '5', '6'],
 'blue': ['9', '10', '15', '43'],
 'candle': ['1', '2', '4', '5', '6', '9'],
 'delta': ['14', '43', '47'],
 'dragon': ['23', '24', '25', '26'],
 'eclipse': ['11', '13', '15', '19'],
 'is': ['5', '6', '13', '45', '96'],
 'island': ['1', '34', '35'],
 'yes': ['1', '2', '3', '11'],
 'zone': ['5', '6', '9', '10', '12', '14', '18', '19', '29', '45']}

或者通过同等的字典理解:

代码语言:javascript
复制
res = {key: sorted(d1.get(key, []) + d2.get(key, []), key=int)
            for key in set().union(*(d1, d2))}

对于有序字典,事后使用collections.OrderedDict

代码语言:javascript
复制
from collections import OrderedDict

res = OrderedDict(sorted([(k, v) for k, v in res.items()]))
票数 1
EN

Stack Overflow用户

发布于 2018-04-25 08:21:41

您需要使用list.extend而不是list.append

代码语言:javascript
复制
>>> d = defaultdict(list)
>>> for k,v in chain(dict1.items(), dict2.items()):
...     d[k].extend(v)
... 
>>> d
defaultdict(<class 'list'>, {'apple': ['5', '65', '43'], 'blue': ['9', '10', '15', '43'], 'is': ['5', '6', '13', '45', '96'], 'yes': ['1', '2', '3', '11'], 'zone': ['5', '6', '9', '10', '12', '14', '18', '19', '29', '45'], 'appricote': ['1', '2', '3', '4', '5', '6'], 'candle': ['1', '2', '4', '5', '6', '9'], 'delta': ['14', '43', '47'], 'dragon': ['23', '24', '25', '26'], 'eclipse': ['11', '13', '15', '19'], 'island': ['1', '34', '35']})

如果结果列表的顺序很重要,则可以对其进行排序。

票数 3
EN

Stack Overflow用户

发布于 2018-04-25 08:21:45

你的代码太复杂了。

代码语言:javascript
复制
a = {'apple': ['5', '65'], 'blue': ['9', '10', '15', '43'],
     'is': ['5', '6', '13', '45', '96'], 'yes': ['1', '2', '3', '11'],
     'zone': ['5', '6', '9', '10', '12', '14', '18', '19', '29', '45']}

b = {'apple': ['43'], 'appricote': ['1', '2', '3', '4', '5', '6'],
     'candle': ['1', '2', '4', '5', '6', '9'], 'delta': ['14', '43', '47'],
     'dragon': ['23', '24', '25', '26'], 'eclipse': ['11', '13', '15', '19'],
     'island': ['1', '34', '35']}

output = []
for key in a:
    temp = a[key]
    if key in b:
        temp.extend(b[key])
    output.append('{} {}'.format(key, sorted(temp)))

print('\n'.join(output))

# is ['13', '45', '5', '6', '96']
# blue ['10', '15', '43', '9']
# zone ['10', '12', '14', '18', '19', '29', '45', '5', '6', '9']
# apple ['43', '5', '65']
# yes ['1', '11', '2', '3']

警告:

  • 由于a是一个字典,输出字符串中元素的顺序不是持久的(在Python3.6中)
  • 因为您的值是字符串,所以它们是按字典顺序排序的。

如果两者相关,这两点都可以很容易地加以修正。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50017243

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档