我有:
a=[['2017-07-25 23:48:36+00:00', 48L],
['2017-07-25 23:53:36+00:00', 53L],
['2017-07-25 23:54:36+00:00', None]]
我需要保留时间戳。但是将其他值更改为“无”'到' 0'然后乘以0.1。所以它变成了:
formatted_a = [['2017-07-25 23:48:36+00:00', 4.8L],
['2017-07-25 23:53:36+00:00', 5.3L],
['2017-07-25 23:54:36+00:00', 0]]
我在view.py中有代码:
def replace(a):
return [0 if y is None else 0.1*y for x, y in a]
formatted_a = list(replace(a) for a in a)
我收到了ValueError:ValueError:要解压缩的值太多
答案 0 :(得分:2)
内部列表不需要列表理解。使用列表comp。就像你已经完成的那样,你一次只能在内部列表中迭代一个项目,但是,这两个项目都不能解压缩成两个项目:
def replace(lst):
x, y = lst
return [x, 0 if y is None else 0.1*y]
formatted_a = [replace(x) for x in a]
print(formatted_a)
# [['2017-07-25 23:48:36+00:00', 4.800000000000001],
# ['2017-07-25 23:53:36+00:00', 5.300000000000001],
# ['2017-07-25 23:54:36+00:00', 0]]
或者您可以使用单个列表推导传递整个列表:
def replace(a):
return [[x, 0 if y is None else 0.1*y] for x, y in a]
formatted_a = replace(a)
答案 1 :(得分:0)
您忘记解压缩子列表,因此它变为
def replace(lst):
x, y = lst
return [x,0] if y is None else [x,0.1*y]
a=[['2017-07-25 23:48:36+00:00', 48L],
['2017-07-25 23:53:36+00:00', 53L],
['2017-07-25 23:54:36+00:00', None]]
formatted_a = [replace(x) for x in a]
print formatted_a
答案 2 :(得分:0)
你做错了,因为你要从数组中解包两个参数,这将导致这个。 这是正确的答案:
a=[['2017-07-25 23:48:36+00:00', 48L],
['2017-07-25 23:53:36+00:00', 53L],
['2017-07-25 23:54:36+00:00', None]]
def replace(a):
return [0 if y is None else 0.1*y if x == 1 else y for x, y in enumerate(a)]
formatted_a = list(replace(a) for a in a)
print formatted_a
答案 3 :(得分:0)
您可以在python中使用itertools迭代列表列表。 这是代码:
In [61]: import itertools
In [80]: def replace(a):
...: l = []
...: for i in itertools.chain(a):
...: l.append(map(lambda x:x if x != None else '0', i))
...:
...: return l
...:
...:
...:
a = [['2017-07-25 23:48:36+00:00', 48L],
['2017-07-25 23:53:36+00:00', 53L],
['2017-07-25 23:54:36+00:00', None]]
In [81]: replace(a)
这是输出:
Out[81]:
[['2017-07-25 23:48:36+00:00', 48L],
['2017-07-25 23:53:36+00:00', 53L],
['2017-07-25 23:54:36+00:00', '0']]