列表理解与几个参数

时间:2014-09-10 08:17:06

标签: python for-loop list-comprehension

我有一些for循环,就像这里:

time1 = 0
timeDifference = []
for time2 in uniqueUserData['TIME']:
    timeDifference.append(time2 - time1)
    time1 = time2

我想在这里使用列表解析,我怎么能把第二个语句放在表达式中?我试试

[(timeDifference.append(time2 - time1), time1 = time2) for time2 in uniqueUserData['TIME']]

但收到错误消息invalid syntax。可能time1未知......

同样重要的uniqueUserData['TIME']不仅仅是一个列表,是一个DF pandas列,因此是Sequency ...当我使用df[columnName][someIndex]时,我接下来会收到错误消息。但是好吧,我可能会根据zip找到一些针对DF的解决方案(非常好的主意)。谢谢大家。

4 个答案:

答案 0 :(得分:4)

使用zip

>>> userdata = [1, 4, 5, 9]
>>> zip(userdata, [0] + userdata)
[(1, 0), (4, 1), (5, 4), (9, 5)]
>>> [time2 - time1 for time2, time1 in zip(userdata, [0] + userdata)]
[1, 3, 1, 4]

timeDifference = [
    time2 - time1 for time2, time1 in
    zip(uniqueUserData['TIME'], [0] + uniqueUserData['TIME'])
]

注意如果[0] + list(uniqueUserData['TIME'])不是列表对象,则应使用uniqueUserData['TIME']

或者,您可以使用itertools.chain([0], uniqueUserData['TIME'])

答案 1 :(得分:1)

你在找这个吗?

>>> uniqueUserData = {'TIME' : [5,20,15]}
>>> [ uniqueUserData['TIME'][idx-1] - uniqueUserData['TIME'][idx]
...   for idx in range(1,len(uniqueUserData['TIME']))
... ]
[-15, 5]

答案 2 :(得分:1)

您不能在表达式中添加语句。永远。这意味着如果你想不出一种在没有作业或其他陈述的情况下编写循环的方法,你就不能使用列表理解。

哪个好 - 不是一切都应该是理解。 for语句没有错。

但通常情况下,有一种方法可以重新思考这个问题,以便它不会做任何任务,或者根本就没有任何突变,而且通常这种设计比你开始时更好。

为了完成这项工作,您需要通过循环访问当前值和先前值的某种方式。

如果你有一个list,并且你可以为相同大小的额外列表浪费足够的内存,这很容易:正如falsetru的答案所示,只需拉链具有相同列表的列表偏移一个,并且您将获得与其前任配对的每个值。但是如果你的列表太大,或者它根本不是一个列表,只是某种迭代(甚至可能是迭代器),你需要一个迭代器来记住你以前的值。最简单的方法是使用tee

a, b = itertools.tee(data)
return zip(a, itertools.chain([0], b))

你可以将它包装在一个函数中以使其可重用。事实上,您会在itertools文档的配方部分找到一个非常相似的功能(不同之处在于它以(last, current)顺序而不是(current, last)生成对,并且它以(a[0], a[1])而非(0, a[0]))开头。

答案 3 :(得分:0)

例如

>>> tim= [10,20,30,40,50,60]
>>> [ t-tim[tim.index(t)-1] for r in tim[1:] ]
[10, 10, 10, 10, 10]