假设我有这样一句话:
{'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]
我写了一种蛮力方法,但我觉得有一种更强势的方法(还因为一旦实现,代码片段就会使我的代码变成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 ...
有没有蟒蛇方法?
发布于 2018-07-19 03:49:25
下面的代码依赖于itertools.chain.from_iterable
将这些项目展平成一个单独的列表。我们从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']
发布于 2018-07-19 03:49:21
第一个密钥在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']
发布于 2018-07-19 03:52:16
您可以使用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)。
https://stackoverflow.com/questions/51409852
复制相似问题