当字典的值为列表时,如何过滤字典



我是Python新手,希望您能帮助我。

我有一个结构如下的字典:

inventory = {
"brand": ["bmw", "audi", "harley davidson"],
"type": ["car", "car", "motorcycle"],
"value": [100, 200, 150],
}

我想知道是否可以按品牌和类型过滤。

这是一种更python化的方式。没有外部库。如果您经常与数据打交道,那么熟悉函数式编程风格也很有好处。这是写幂等的一种简洁方式对数据的操作

import functools
inventory = {
"brand": ["bmw", "audi", "harley davidson"],
"type": ["car", "car", "motorcycle"],
"value": [100, 200, 150],
}
def is_car(i):
return inventory["type"][i] == 'car' 
cars_total_value = functools.reduce(
lambda total, v: total + v[1] if is_car(v[0]) else total,
enumerate(inventory["value"]),
0
)
print('Cars total value: %.2f' % cars_total_value)

Pandas正迅速成为Python世界中最优秀的CSV解析和表格过滤包。我不会试图猜测您是如何读取CSV的,但是从字典开始,您可以这样做:

import pandas as pd
inventory = {
"brand": ["bmw", "audi", "harley davidson"],
"type": ["car", "car", "motorcycle"],
"value": [100, 200, 150],
}
df = pd.DataFrame(inventory)
df.query('type == "car"')

打印

brand type  value
0   bmw  car    100
1  audi  car    200

在将来,考虑使用pd.read_csv直接从CSV文件创建一个数据帧。

common

car_sum_res = 0
for index, t in enumerate(inventory['type']):
if t == 'car':
car_sum_res += inventory['value'][index]
print(car_sum_res)
熊猫

import pandas as pd
inventory = {
"brand": ["bmw", "audi", "harley davidson"],
"type": ["car", "car", "motorcycle"],
"value": [100, 200, 150],
}
df = pd.DataFrame(inventory)
car_sum_res = df.loc[df['type'] == 'car', 'value'].sum()
print(car_sum_res)

您可能想要查看pandas以方便地操作数据框架。

import pandas as pd
inventory = {
"brand": ["bmw", "audi", "harley davidson"],
"type": ["car", "car", "motorcycle"],
"value": [100, 200, 150],
}
df = pd.DataFrame.from_dict(inventory)
print(df)
[Output]
brand        type  value
0              bmw         car    100
1             audi         car    200
2  harley davidson  motorcycle    150

在数据框架中,操作数据很容易,但是您可能需要研究特定的函数。

df['value'].sum()
450
df['value'].where(df['type'] == 'car').sum().astype(int)
300

(你可能需要做一些类型转换来得到你想要的结果)
作为一个额外的好处,如果你的数据是在Excel电子表格中,pandas可以直接读取它:

df = pd.read_excel('myfile.xlsx')

(这是个简单的例子;熊猫有很多选择

最新更新