我有一个列表,我想根据列表中元素的百分比变化来制作它的子列表。例如:
list=[11.7, 8.5, 11.3, 11.2, 10.8, 1.05]
plist = [100.0 * e1 / e2 - 100 for e1, e2 in zip(list[1:], list)]
plist是:
[-27.350427350427353, 32.94117647058823, -0.8849557522123916,
-3.5714285714285694, -90.27777777777777]
任何连续元素的百分比变化> -5将被分组到子列表中,如
[11.7, [8.5, 11.3, 11.2, 10.8], 1.05]
有没有其他方法可以在不使用长列表推导方法的情况下获得所需的输出?
答案 0 :(得分:1)
l=[11.7, 8.5, 11.3, 11.2, 10.8, 1.05, 11.7, 8.5, 11.3, 11.2, 10.8, 1.05]
print(l)
ul=[l[0]]
l2=[]
i=0
flag = True
while i < len(l)-1:
x = 100.0 * l[i+1] / l[i] - 100
if x > (-5):
if l[i] not in l2:
l2.append(l[i])
if l[i+1] not in l2:
l2.append(l[i+1])
else:
l2=[]
if i !=0:
ul.append(l[i+1])
if l2:
if l2 not in ul:
ul.append(l2)
i+=1
print(ul)
输出1
[11.7, 8.5, 11.3, 11.2, 10.8, 1.05]
[11.7, [8.5, 11.3, 11.2, 10.8], 1.05]
输出2
[11.7, 8.5, 11.3, 11.2, 10.8, 1.05, 11.7, 8.5, 11.3, 11.2, 10.8, 1.05]
[11.7, [8.5, 11.3, 11.2, 10.8], 1.05, [1.05, 11.7], 8.5, [8.5, 11.3, 11.2, 10.8], 1.05]
两个列表中都包含8.5
和1.05
项;我认为这是预期的。
其他详情
0 11.7 -27.350427350427353
1 8.5 32.94117647058823
2 11.3 -0.8849557522123916
3 11.2 -3.5714285714285694
4 10.8 -90.27777777777777
5 1.05 1014.2857142857142
6 11.7 -27.350427350427353
7 8.5 32.94117647058823
8 11.3 -0.8849557522123916
9 11.2 -3.5714285714285694
10 10.8 -90.27777777777777
答案 1 :(得分:1)
您需要跟踪子列表是否正在进行中。这样的事情会起作用:
values = [11.7, 8.5, 11.3, 11.2, 10.8, 1.05] # 'list' is a bad name
grouped_values = [values[0]]
sublist = None
for x, y in zip(values[:-1], values[1:]):
change = 100.0 * y / x - 100.0
if change > -5:
if sublist is None:
sublist = []
sublist.append(y)
else:
if sublist is not None:
grouped_values.append(sublist)
sublist = None
grouped_values.append(y)
if sublist is not None:
grouped_values.append(sublist)
答案 2 :(得分:1)
然而,我没有用预期输出的例子清楚地得到你的标准。您可以申请以下内容:
Values = [11.7, 8.5, 11.3, 11.2, 10.8, 1.05]
首先确定列表中的更改位置(这里的if条件是我对5%更改的理解,您可能希望根据需要对其进行更改)
ChangePosition = [ Ind+1 for Ind,Pair in enumerate(zip(Values,Values[1:]))
if ((Pair [0] - Pair [1]) / Pair [0] > -0.05) ]
然后添加可能位置的开头和结尾。
ChangePosition = [0] + ChangePosition + [len(Values)]
最后,根据这些位置对值进行切片:
GroupedValues = [ Values[Start:Finish] if (Finish-Start)> 1 else Values[Start]
for Start,Finish in zip(ChangePosition ,ChangePosition [1:])]
答案 3 :(得分:0)
从lxop开始回答&#39;我相信,我做了这个工作代码
提示没问题,但您需要的唯一标志是sublist
是否为空if sublist != []
我确实将[values[-1]/2]
添加到values[1:]
,因此zip
并未切断values
的最后一个元素
然后使用x
= values[-1]/2
的计算强制values
(= y
)的最后一个元素进入else
子句,该子句执行正确的操作最后一个元素是否在最后一个子列表中
values = [11.7, 8.5, 11.3, 11.2, 10.8, 5, 1.05, 1.9, 1]
grouped_values, sublist = [], []
for x, y in zip(values[1:] + [values[-1]/2], values):
if 100.0 * (x / y - 1) > -5:
sublist.append(y)
else:
if sublist != []:
sublist.append(y)
grouped_values.append(sublist)
sublist = []
else:
grouped_values.append(y)
grouped_values
Out[181]: [11.7, [8.5, 11.3, 11.2, 10.8], 5, [1.05, 1.9], 1]