首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >使用Python将字典解析为特定的列表格式

使用Python将字典解析为特定的列表格式
EN

Stack Overflow用户
提问于 2018-07-19 03:40:50
回答 5查看 88关注 0票数 1

假设我有这样一句话:

代码语言:javascript
复制
{'red':'boop','white':'beep','rose':'blip'}

我想把它列在一个列表中,如下所示

代码语言:javascript
复制
['red','boop','end','white','beep','rose','blip','end']

要放在列表前面的键/值是输入。

所以我基本上我想要[first_key, first_value,end, .. rest of the k/v pairs..,end]

我写了一种蛮力方法,但我觉得有一种更强势的方法(还因为一旦实现,代码片段就会使我的代码变成O(n^2) )

代码语言:javascript
复制
for item in lst_items    
    data_lst = []
    for key, value in item.iteritems():
        data_lst.append(key)
        ata_lst.append(value)
    #insert 'end' at the appropiate indeces
 #more code ...

有没有蟒蛇方法?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2018-07-19 03:49:25

下面的代码依赖于itertools.chain.from_iterable将这些项目展平成一个单独的列表。我们从chain中提取前两个值,然后使用它们构建一个新的列表,并使用其余的值扩展该列表。

代码语言:javascript
复制
from itertools import chain

def ends(d):
    if not d:
        return []
    c = chain.from_iterable(d.iteritems())
    l = [next(c), next(c), "end"]
    l.extend(c)
    l.append("end")
    return l

ends({'red':'boop','white':'beep','rose':'blip'})
# ['rose', 'blip', 'end', 'white', 'beep', 'red', 'boop', 'end']

如果您知道您首先想要的键,而不关心其他的,我们可以使用延迟计算的生成器表达式将其从扁平化列表中删除。

代码语言:javascript
复制
def ends(d, first):
    if not d:
        return []
    c = chain.from_iterable((k, v) for k, v in d.iteritems() if k != first)
    l = [first, d[first], "end"]
    l.extend(c)
    l.append("end")
    return l

ends({'red':'boop','white':'beep','rose':'blip'}, 'red')
# ['red', 'boop', 'end', 'rose', 'blip', 'white', 'beep', 'end']
票数 2
EN

Stack Overflow用户

发布于 2018-07-19 03:49:21

第一个密钥在first变量中指定:

代码语言:javascript
复制
first = 'red'

d = {'red':'boop','white':'beep','rose':'blip'}

new_l = [first, d[first], 'end']
for k, v in d.items():
    if k == first:
        continue
    new_l.append(k)
    new_l.append(v)
new_l.append('end')
print(new_l)

打印:

代码语言:javascript
复制
['red', 'boop', 'end', 'white', 'beep', 'rose', 'blip', 'end']
票数 1
EN

Stack Overflow用户

发布于 2018-07-19 03:52:16

您可以使用enumerate并检查当前索引:

代码语言:javascript
复制
>>> d = {'red':'boop','white':'beep','rose':'blip'}
>>> [x for i, e in enumerate(d.items())
...    for x in (e + ("end",) if i in (0, len(d)-1) else e)]
...
['white', 'beep', 'end', 'red', 'boop', 'rose', 'blip', 'end']

但是,您最初的想法,首先链接键和值,然后插入"end"项,也不会有O(n²)。它将是O(n),然后是另一个O(n),因此仍然是O(n)。

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

https://stackoverflow.com/questions/51409852

复制
相关文章

相似问题

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