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

时间:2018-07-18 19:40:50

标签: python python-2.7 list dictionary

说我有以下字典

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

任何Python方法?

5 个答案:

答案 0 :(得分:2)

以下内容依靠itertools.chain.from_iterable将项目展平到一个列表中。我们从['red', 'boop', 'end', 'white', 'beep', 'rose', 'blip', 'end'] 中提取前两个值,然后使用它们来构建一个新列表,并与其余值一起扩展。

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

答案 1 :(得分:1)

第一个键在export default DS.JSONAPISerializer.extend({ normalizeResponse(store, primaryModelClass, payload, id, requestType) { payload.data.id = payload.data.attributes._id; delete payload.data.attributes._id; return this._super(...arguments); }, }); 变量中指定:

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)

答案 2 :(得分:0)

您可以使用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)。

答案 3 :(得分:0)

data_lst = [x for k, v in lst_itemsL.iteritems() for x in (k, v) ] 
data_lst.insert(2, 'end') 
data_lst.append('end') 

这是pythonic;尽管效率可能会相同(此处无法提供帮助)。 这应该比在循环中放置if块要快...

答案 4 :(得分:0)

from itertools import chain
list(chain(*item.items())) + ['end']