Python 具有多个参数的列表理解
我为循环提供了一些Python 具有多个参数的列表理解,python,for-loop,list-comprehension,Python,For Loop,List Comprehension,我为循环提供了一些,如下所示: time1 = 0 timeDifference = [] for time2 in uniqueUserData['TIME']: timeDifference.append(time2 - time1) time1 = time2 我想在这里使用列表理解,我怎样才能把第二个语句放在表达式中?我试着 [(timeDifference.append(time2 - time1), time1 = time2) for time2 in uniqu
,如下所示:
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']]
但收到错误消息语法无效
。可能time1
未知
同样重要的是,uniqueUserData['TIME']
不仅仅是一个列表,而是一列数据,因此顺序性。。。当我使用df[columnName][someIndex]
时,我收到了错误消息。但好的,我可能会根据zip找到一些特定于DF的解决方案(非常好的主意)。谢谢大家。使用:
注意如果uniqueUserData['TIME']
不是列表对象,则应使用[0]+list(uniqueUserData['TIME'])
或者,您可以使用。使用:
注意如果uniqueUserData['TIME']
不是列表对象,则应使用[0]+list(uniqueUserData['TIME'])
或者你也可以使用。你在找这个吗
>>> uniqueUserData = {'TIME' : [5,20,15]}
>>> [ uniqueUserData['TIME'][idx-1] - uniqueUserData['TIME'][idx]
... for idx in range(1,len(uniqueUserData['TIME']))
... ]
[-15, 5]
你在找这个吗
>>> uniqueUserData = {'TIME' : [5,20,15]}
>>> [ uniqueUserData['TIME'][idx-1] - uniqueUserData['TIME'][idx]
... for idx in range(1,len(uniqueUserData['TIME']))
... ]
[-15, 5]
举个例子怎么样
>>> tim= [10,20,30,40,50,60]
>>> [ t-tim[tim.index(t)-1] for r in tim[1:] ]
[10, 10, 10, 10, 10]
举个例子怎么样
>>> tim= [10,20,30,40,50,60]
>>> [ t-tim[tim.index(t)-1] for r in tim[1:] ]
[10, 10, 10, 10, 10]
不能在表达式中放入语句。曾经这意味着如果你想不出一种没有赋值或其他语句的方法来编写循环,你就不能使用列表理解
这很好,不是每件事都应该是一种理解。for
语句没有任何错误
但通常,有一种方法可以重新思考问题,这样它就不会做任何分配,或者根本不会做任何突变,而且这种设计通常比你开始时的设计更好
为了实现这一点,您需要某种方法来访问当前值和每次通过循环访问的前一个值
如果您有一个列表
,并且您可以为相同大小的额外列表浪费足够的内存,那么这很容易:正如falsetru的回答所示,只需将相同列表的偏移量压缩一次,就可以将每个值与其前一个值配对。但是如果您的列表太大,或者它可能根本不是列表,只是某种iterable(甚至可能是迭代器),那么您需要一个迭代器来记住以前的值。最简单的方法是:
您可以将其封装在一个函数中,使其可重用。事实上,您会在文档的recipes部分发现一个非常类似的函数(区别在于它以(last,current)
顺序而不是(current,last)
,生成成对的,并且它以(a[0],a[1])
开始,而不是(0,a[0])
。您不能在表达式中放入语句。曾经这意味着如果你想不出一种没有赋值或其他语句的方法来编写循环,你就不能使用列表理解
这很好,不是每件事都应该是一种理解。for
语句没有任何错误
但通常,有一种方法可以重新思考问题,这样它就不会做任何分配,或者根本不会做任何突变,而且这种设计通常比你开始时的设计更好
为了实现这一点,您需要某种方法来访问当前值和每次通过循环访问的前一个值
如果您有一个列表
,并且您可以为相同大小的额外列表浪费足够的内存,那么这很容易:正如falsetru的回答所示,只需将相同列表的偏移量压缩一次,就可以将每个值与其前一个值配对。但是如果您的列表太大,或者它可能根本不是列表,只是某种iterable(甚至可能是迭代器),那么您需要一个迭代器来记住以前的值。最简单的方法是:
您可以将其封装在一个函数中,使其可重用。事实上,您会在文档的recipes部分发现一个非常类似的函数(不同之处在于它以(last,current)
顺序而不是(current,last)
,并且它以(a[0],a[1])
(0,a[0])
我认为timeDifference
应该是返回像int这样的对象的函数。在numpy中有一个有用的函数。在Python中,你永远不能在表达式中放入语句。这意味着如果你想不出一种没有赋值或其他语句的方法来编写循环,你就不能使用列表理解。这很好,不是每件事都应该是一种理解。(也就是说,通常一个可以被理解的不变的设计也是一个更好的设计……但如果不是这样,或者你就是想不出来,就用一个for
语句。)我认为timeDifference
应该是返回像int这样的对象的函数。在numpy中有一个有用的函数。在Python中,永远不能在表达式中放入语句。这意味着如果你想不出一种没有赋值或其他语句的方法来编写循环,你就不能使用列表理解。这很好,不是每件事都应该是一种理解。(也就是说,通常一个可以被理解的不变的设计也是一个更好的设计……但是如果不是这样,或者你不能理解它,就用一个for
语句。)你在最后一个例子中有一个输入错误:对于time2,time1
丢失。而且,如果uniqueUserData['TIME',这不起作用
不是一个列表。您不能将列表连接到常规iterable(+
)。@JuanCespedes,感谢您指出它们。我相应地更新了答案。链
可能更好,即使它是一个列表,因为它避免了创建列表的完整副本。但它仍然不能解决只处理序列的问题;如果userdata
是一个迭代器,那么zip
每一步将前进两步,因为您将两个引用前进到同一个迭代器……好的,您的答案会帮助很多。谢谢你
a, b = itertools.tee(data)
return zip(a, itertools.chain([0], b))