说我有以下字典
{'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方法?
答案 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']