我有一个这样的嵌套列表:
[['Asan', '20180418', 'A', '17935.00'],
['Asan', '20180417', 'B', '17948.00'],
['Asan', '20180416', 'C', '17979.00'],
['Asan', '20180416', 'D', '17816.00'],
.
.
.
.
['Asan', '20180415', 'N', '18027.00']]
我需要对每个列表中的第3个元素进行一些计算,并使用前面的那个,例如:
if (A/B) > 0.05: ....
if (B/C) > 0.05: ....
if (C/D) > 0.05: ....
.
.
if (N-1/N) == 1: ....
如果条件不满足,我会弹出该列表。
我如何处理这个问题,以及最快速和最快速的方法。
编辑: 让我澄清一下: A和B等是FLOATS,我只是将它们命名为A,B,...以便更好地理解。 if语句应该找到A是否比前一个浮点B大多少。
答案 0 :(得分:1)
zip
可以轻松实现成对比较:
l = [['Asan', '20180418', 'A', '17935.00'],
['Asan', '20180417', 'B', '17948.00'],
['Asan', '20180416', 'C', '17979.00'],
['Asan', '20180416', 'C', '200.00'],
['Asan', '20180416', 'D', '17816.00']]
new_list = []
for x, y in zip(l, l[1:]):
if x[2] == y[2]:
new_list.extend([x, y])
print(new_list)
# [['Asan', '20180416', 'C', '17979.00'],
# ['Asan', '20180416', 'C', '200.00']]
修改强>:
如果'A'
,'B'
,'C'
..是float
s,那么要检查您需要的条件,您可以替换上例中的条件。如果满足这个条件就做任何事情。
答案 1 :(得分:0)
你的意思是这样吗?
l = [['Asan', '20180418', 'A', '17935.00'],
['Asan', '20180417', 'B', '17948.00'],
['Asan', '20180416', 'C', '17979.00'],
['Asan', '20180416', 'C', '200.00'],
['Asan', '20180416', 'D', '17816.00']]
last_seen = l[0]
new_list = []
for r in l[1:]:
if r[2] == last_seen[2]:
new_list.append(last_seen)
new_list.append(r)
last_seen = r
print(new_list)
给出了:
[['Asan', '20180416', 'C', '17979.00'], ['Asan', '20180416', 'C', '200.00']]
答案 2 :(得分:0)
由于您需要测试顶部列表中每个元素的条件,您需要迭代它。
由于无法计算第一个元素的条件(没有'在'元素之前),我们可以从索引1而不是0开始。
子列表中的第3个元素可以通过它的索引引用。 我们可以通过减少索引来获取我们现在看到的子列表之前的子列表。
由于循环,它不会很快,但最pythonic方式将是一个oneline循环。
new_list = [l[i] for i in range(1, len(l)) if float(l[i][3])/float(l[i-1][3]) > 0.05]
#new_list = [['Asan', '20180417', 'B', '17948.00'], ['Asan', '20180416', 'C', '17979.00'], ['Asan', '20180416', 'D', '17816.00']]
由于可读性,我会使用多行for循环。
new_list = []
for i in range(1, len(l)):
if float(l[i][3])/float(l[i-1][3]) > 0.05:
new_list.append(l[i])
答案 3 :(得分:-1)
试试这个
for i in range(len(l)):
if l[i][2] <Operator> l[i + 1][2] <Condtion> exp/value:
Do something here