Python 基于其他列表上的值更新列表
我有一个列表,每个列表包含四个元素,这些元素表示Python 基于其他列表上的值更新列表,python,Python,我有一个列表,每个列表包含四个元素,这些元素表示id,age,val1,val2。我处理每个列表的方式是,该列表的val1和val2值始终取决于前面列表中看到的最新值。列表的先前列表是年龄差异不小于timeDelta的列表。列表列表按年龄顺序排列 我的代码运行得很好,但速度很慢。我觉得标记为**的行生成了太多列表,可以通过不断从开始的列表中删除列表来避免,我知道一个列表与下一个列表的年龄差异大于timeDelta myList = [ [1, 20, '', 'x
id
,age
,val1
,val2
。我处理每个列表的方式是,该列表的val1
和val2
值始终取决于前面列表中看到的最新值。列表的先前列表是年龄差异不小于timeDelta
的列表。列表列表按年龄顺序排列
我的代码运行得很好,但速度很慢。我觉得标记为**的行生成了太多列表,可以通过不断从开始的列表中删除列表来避免,我知道一个列表与下一个列表的年龄差异大于timeDelta
myList = [
[1, 20, '', 'x'],
[1, 25, 's', ''],
[1, 26, '', 'e'],
[1, 30, 'd', 's'],
[1, 50, 'd', 'd'],
[1, 52, 'f', 'g']
]
age_Idx =1
timeDelta = 10
for i in range(len(myList))[1:]:
newList = myList[:i+1] #Subset of lists. #********
respList = newList.pop(-1)
currage = float(respList[age_Idx])
retval = collapseListTogether(newList, age_Idx, currage, timeDelta)
if(len(retval) == 0):
continue
retval[0:2] = respList[0:2]
print(retval)
def collapseListTogether(li, age_Idx, currage, timeDelta):
finalList = []
for xl in reversed(li) :
#print(xl)
oldage = float(xl[age_Idx])
if ((currage-timeDelta) <= oldage < currage):
finalList.append(xl)
else:
break
return([reduce(lambda a, b: b or a, tup) for tup in zip(*finalList[::-1])])
我只是在重写您的数据结构和代码:
from collections import namedtuple
Record = namedtuple('Record', ['id', 'age', 'val1', 'val2'])
myList = [
Record._make([1, 20, '', 'x']),
Record._make([1, 25, 's', '']),
Record._make([1, 26, '', 'e']),
Record._make([1, 30, 'd', 's']),
Record._make([1, 50, 'd', 'd']),
Record._make([1, 52, 'f', 'g'])
]
timeDelta = 10
for i in range(1, len(myList)):
subList = list(myList[:i+1])
rec = supList.pop(-1)
age = float(rec.age)
retval = collapseListTogether(subList, age, timeDelta)
if len(retval) == 0:
continue
retval.id, retval.age = rec.id, rec.age
print(retval)
def collapseListTogether(lst, age, tdelta):
finalLst = []
[finalLst.append(ele) if age - float(ele.age) <= tdelta and age > float(ele.age)
else None for ele in lst]
return([reduce(lambda a, b: b or a, tup) for tup in zip(*finalLst[::-1])])
从集合导入namedtuple
Record=namedtuple('Record',['id','age','val1','val2']))
myList=[
记录。_make([1,20','x']),
记录。_make([1,25,'s',''),
记录。_make([1,26,,'e']),
记录。_make([1,30,'d','s']),
记录。_make([1,50,'d','d']),
记录。_make([1,52,'f',g'])
]
时间增量=10
对于范围(1,len(myList))中的i:
子列表=列表(myList[:i+1])
rec=supList.pop(-1)
年龄=浮动(记录年龄)
retval=collapseListTogether(子列表、年龄、时间增量)
如果len(retval)==0:
持续
retval.id,retval.age=rec.id,rec.age
打印(返回)
def collapseListTogether(lst、age、tdelta):
finalLst=[]
[最终附加(ele)if age-float(ele.age)float(ele.age)
lst中ele的其他无]
返回([reduce(lambda,b:b或a,tup)表示zip中的tup(*finalLst[:-1]))
我看不懂你的代码。我没有改变逻辑,只是修改了性能的位置
解决方法之一是使用tuple替换4元素列表,使用namedtuple更好,后者是Python中著名的高性能容器。此外,在解释语言中应该避免for循环。在python中,如果可能的话,可以使用理解而不是for循环来提高性能。你们的单子不算太大,所以在高效的行传中赢得的时间应该比在中断中赢得的时间要多
对我来说,您的代码不应该工作,但我不确定。假设您的示例是正确的,我认为没有理由不能在一个过程中完成这项工作,因为它们是按年龄排序的。如果您检查的最后一个子列表差异太大,您知道前面的任何内容都不起作用,因此您应该保持当前子列表不变
previous_age = None
previous_val1 = ''
previous_val2 = ''
for sublist in myList:
age = sublist[1]
latest_val1 = sublist[2]
latest_val2 = sublist[3]
if previous_age is not None and ((age - previous_age) <= timeDelta):
# there is at least one previous list
sublist[2] = previous_val1
sublist[3] = previous_val2
previous_age = age
previous_val1 = latest_val1 or previous_val1
previous_val2 = latest_val2 or previous_val2
构建新列表而不是就地编辑列表,或者完全省略跳过的行而不是保持不变,这是一个简单的修改
reduce和list理解是强大的工具,但它们并不适用于所有问题。这个问题的标题非常模糊……尽管我承认我现在没有更好的建议。
对于I in range(len(myList))[1::
函数使用start和stop参数。例如range(1,len(myList))
将从1
开始范围。这里不需要额外的切片。如果<代码> MyList非常大,考虑使用<代码> xRange[A] /代码>我想你可能已经误会了你的问题:“列表中的前一个列表是那些年龄差异不小于TimeDelphi的列表”。但您的示例显示了从列表中获取小于您的时间增量的值。
previous_age = None
previous_val1 = ''
previous_val2 = ''
for sublist in myList:
age = sublist[1]
latest_val1 = sublist[2]
latest_val2 = sublist[3]
if previous_age is not None and ((age - previous_age) <= timeDelta):
# there is at least one previous list
sublist[2] = previous_val1
sublist[3] = previous_val2
previous_age = age
previous_val1 = latest_val1 or previous_val1
previous_val2 = latest_val2 or previous_val2
[[1, 20, '', 'x'],
[1, 25, '', 'x'],
[1, 26, 's', 'x'],
[1, 30, 's', 'e'],
[1, 50, 'd', 'd'],
[1, 52, 'd', 'd']]