比较嵌套列表之间的值

时间:2019-11-11 20:33:43

标签: python python-3.x list nested

我正在尝试比较两个单独列表中具有匹配名称的最后一个值。例如:[(('Matching Name', '2015-06-25', 25.37), ('Matching Name', '2018-08-09', 74.66))]我想通过[]括号内具有匹配名称的每个嵌套列表,将百分比变化从25.37提取到74.66。

示例输入数据:

>  "(('', '2015-06-25', 25.37), ('', '2018-08-09', 74.66))","(('A',
> '2008-12-26', 10.38), ('A', '2019-04-29', 77.33))","(('AA',
> '2016-11-01', 22.92), ('AA', '2019-04-29', 26.85))","(('AAL',
> '2008-12-26', 7.1), ('AAL', '2019-04-29', 33.77))","(('AAMC',
> '2012-12-13', 15.), ('AAMC', '2019-04-29', 9.94))"

2 个答案:

答案 0 :(得分:0)

一种方法是创建一个字典,其中的键是“匹配名称”,值是最后一个值的列表,然后对给定键的每个值执行计算。

目前尚不清楚您拥有什么数据结构,但是如果与以下假定的结构不同,则可以修改代码。

在下面的代码中,首先将列表缩小为“名称”和“价格”的元组。

from collections import defaultdict

the_list = [(
    ('', '2015-06-25', 25.37), ('', '2018-08-09', 74.66),
    ('A', '2008-12-26', 10.38), ('A', '2019-04-29', 77.33),
    ('AA','2016-11-01', 22.92), ('AA', '2019-04-29', 26.85),
    )] 

reduced_list = [(x,z) for tick in the_list for x,y,z in tick]
print(reduced_list) 
# [('', 25.37), ('', 74.66), ('A', 10.38), ('A', 77.33), ('AA', 22.92), ('AA', 26.85)]

然后创建一个字典,其中关键字是名称,值是价格列表

# Map all 'Matching Name', where the dict key is 'Matching Name' 
# and dict value is a list of last values
tickDict = defaultdict(list)
for key, val in reduced_list:
    tickDict[key].append(val)

print(tickDict)
# defaultdict(<class 'list'>, {'': [25.37, 74.66], 'A': [10.38, 77.33], 'AA': [22.92, 26.85]})

最后,您可以通过计算来执行您的计算,例如计算更改:

# Compute percentage change
ratio = {key: tickDict[key][1]/tickDict[key][0]-1 for key in tickDict}
print(ratio)
# {'': 1.9428458809617655, 'A': 6.449903660886319, 'AA': 0.17146596858638752}

答案 1 :(得分:0)

pandas是一个很好的第三方工具,可用于此目的:

raw = [
    ('', '2015-06-25', 25.37), ('', '2018-08-09', 74.66),
    ('A', '2008-12-26', 10.38), ('A', '2019-04-29', 77.33),
    ('AA', '2016-11-01', 22.92), ('AA', '2019-04-29', 26.85),
    ('AAL', '2008-12-26', 7.1), ('AAL', '2019-04-29', 33.77),
    ('AAMC', '2012-12-13', 15.), ('AAMC', '2019-04-29', 9.94)
]


import pandas as pd
df = pd.DataFrame(raw, columns=['symbol', 'date', 'value'])
df['date'] = pd.to_datetime(df['date'])
df.sort_values( ['symbol', 'date'] )

grouped = dict(list(df.groupby('symbol')))
for symbol, performance in grouped.items():
    print('')
    print(symbol)
    print(performance.drop(columns=['symbol']).diff())

输出如下:

''
       date  value
0       NaT    NaN
1 1141 days  49.29

'A'
       date  value
2       NaT    NaN
3 3776 days  66.95

'AA'
      date  value
4      NaT    NaN
5 909 days   3.93

'AAL'
       date  value
6       NaT    NaN
7 3776 days  26.67

'AAMC'
       date  value
8       NaT    NaN
9 2328 days  -5.06