使用Python将dict解析为特定的列表格式

2024-05-23 21:21:57 发布

您现在位置:Python中文网/ 问答频道 /正文

假设我有下面的格言

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

我想把它列成这样的清单

['red','boop','end','white','beep','rose','blip','end']

要放在列表前面的键/值是一个输入。你知道吗

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

我写了一个蛮力的方法,但我觉得有一个更python的方法来做它(而且还因为一旦实现了代码片段将使我的代码O(n^2))

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 ...

有没有什么好办法?你知道吗


Tags: the方法key代码forvalueredbeep
3条回答

下面的依赖于^{}将项展平到单个列表中。我们从chain中提取前两个值,然后使用它们构建一个新的列表,并用其余的值扩展该列表。你知道吗

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']

如果您首先知道所需的键,而不关心其余的键,则可以使用延迟计算的生成器表达式将其从展开列表中移除。你知道吗

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']

第一个键在first变量中指定:

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)

印刷品:

['red', 'boop', 'end', 'white', 'beep', 'rose', 'blip', 'end']

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

>>> 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)。你知道吗

相关问题 更多 >