繁体   English   中英

如何获取嵌套列表中的最大值?

[英]How to get the max value in a nested list?

我试图获得此列表中每个“国家”的MAX价格。

my_list = [
    ['Morocco', 'Fish', datetime.datetime(2020, 11, 17, 0, 0),'0,012'], 
    ['Morocco', 'Fish', datetime.datetime(2020, 11, 17, 0, 0),'0,153'], 
    ['Morocco', 'Fish', datetime.datetime(2020, 11, 17, 0, 0), '0,114'],
    ['Morocco', 'Fish', datetime.datetime(2020, 11, 17, 0, 0), '0,109'],
    ['Morocco', 'Fish', datetime.datetime(2020, 11, 17, 0, 0), '0,252'],
    ['Spain', 'Fish', datetime.datetime(2020, 11, 17, 0, 0), '0,012'], 
    ['Spain', 'Fish', datetime.datetime(2020, 11, 17, 0, 0), '0,113'], 
    ['Spain', 'Fish', datetime.datetime(2020, 11, 17, 0, 0), '0,116'],
    ['Spain', 'Fish', datetime.datetime(2020, 11, 17, 0, 0), '0,250'],
    ['Spain', 'Fish', datetime.datetime(2020, 11, 17, 0, 0), '0,266'],
    ['Italy', 'Fish', datetime.datetime(2020, 11, 17, 0, 0), '0,112'], 
    ['Italy', 'Fish', datetime.datetime(2020, 11, 17, 0, 0), '0,025'], 
    ['Italy', 'Fish', datetime.datetime(2020, 11, 17, 0, 0), '0,224'],
    ['Italy', 'Fish', datetime.datetime(2020, 11, 17, 0, 0), '0,256'],
    ['Italy', 'Fish', datetime.datetime(2020, 11, 17, 0, 0), '0,245']]

这是我的代码:

  max_price_per_list = []
  for lst in my_list:
      for price in lst:
          max_value = price[-1]
          max_price_per_list.append(max_value)
  print(max_price_per_list)

我收到以下错误: TypeError: 'datetime.datetime' object is not subscriptable

当我 printend max_price_per_list时,我期望得到以下结果:

['0,252', '0,266', '0,256']
   

您可以省略第二个循环以获取所需的列表。

max_price_per_list = []
for lst in my_list:
    max_value = lst[-1]
    max_price_per_list.append(max_value)
print(max_price_per_list)

但是,如果您想获得每个国家/地区的最大值,我建议您使用pandas package。 您可以使用以下代码获取列表中每个国家/地区的最高价格:

import pandas as pd
df = pd.DataFrame(my_list)
df.groupby(0).max()

>>>            1          2      3
    0                                     
    Italy    Fish 2020-11-17  0,256
    Morocco  Fish 2020-11-17  0,252
    Spain    Fish 2020-11-17  0,266

我试图获得此列表中每个“国家”的最高价格。

见下文

import datetime
from collections import defaultdict

my_list = [
    ['Morocco', 'Fish', datetime.datetime(2020, 11, 17, 0, 0), '0,012'],
    ['Morocco', 'Fish', datetime.datetime(2020, 11, 17, 0, 0), '0,153'],
    ['Morocco', 'Fish', datetime.datetime(2020, 11, 17, 0, 0), '0,114'],
    ['Morocco', 'Fish', datetime.datetime(2020, 11, 17, 0, 0), '0,109'],
    ['Morocco', 'Fish', datetime.datetime(2020, 11, 17, 0, 0), '0,252'],
    ['Spain', 'Fish', datetime.datetime(2020, 11, 17, 0, 0), '0,012'],
    ['Spain', 'Fish', datetime.datetime(2020, 11, 17, 0, 0), '0,113'],
    ['Spain', 'Fish', datetime.datetime(2020, 11, 17, 0, 0), '0,116'],
    ['Spain', 'Fish', datetime.datetime(2020, 11, 17, 0, 0), '0,250'],
    ['Spain', 'Fish', datetime.datetime(2020, 11, 17, 0, 0), '0,266'],
    ['Italy', 'Fish', datetime.datetime(2020, 11, 17, 0, 0), '0,112'],
    ['Italy', 'Fish', datetime.datetime(2020, 11, 17, 0, 0), '0,025'],
    ['Italy', 'Fish', datetime.datetime(2020, 11, 17, 0, 0), '0,224'],
    ['Italy', 'Fish', datetime.datetime(2020, 11, 17, 0, 0), '0,256'],
    ['Italy', 'Fish', datetime.datetime(2020, 11, 17, 0, 0), '0,245']]

data = defaultdict(float)
for country in my_list:
    price = float(country[-1].replace(',', '.'))
    if price > data[country[0]]:
        data[country[0]] = price
print(data)

output

defaultdict(<class 'float'>, {'Morocco': 0.252, 'Spain': 0.266, 'Italy': 0.256})

您不需要嵌套 for 循环。

您可以创建一个包含国家作为键和最大值作为值的字典。

country_max={}
for lst in my_list:
    if lst[0] in country_max.keys(): 
        if country_max[lst[0]]<lst[-1]:
            country_max[lst[0]]=lst[-1]
    else:
        country_max[lst[0]]=lst[-1]
print([v for _,v in country_max.items()])

尝试这个:

import datetime

my_list = [
    ['Morocco', 'Fish', datetime.datetime(2020, 11, 17, 0, 0),'0,012'], 
    ['Morocco', 'Fish', datetime.datetime(2020, 11, 17, 0, 0),'0,153'], 
    ['Morocco', 'Fish', datetime.datetime(2020, 11, 17, 0, 0), '0,114'],
    ['Morocco', 'Fish', datetime.datetime(2020, 11, 17, 0, 0), '0,109'],
    ['Morocco', 'Fish', datetime.datetime(2020, 11, 17, 0, 0), '0,252'],
    ['Spain', 'Fish', datetime.datetime(2020, 11, 17, 0, 0), '0,012'], 
    ['Spain', 'Fish', datetime.datetime(2020, 11, 17, 0, 0), '0,113'], 
    ['Spain', 'Fish', datetime.datetime(2020, 11, 17, 0, 0), '0,116'],
    ['Spain', 'Fish', datetime.datetime(2020, 11, 17, 0, 0), '0,250'],
    ['Spain', 'Fish', datetime.datetime(2020, 11, 17, 0, 0), '0,266'],
    ['Italy', 'Fish', datetime.datetime(2020, 11, 17, 0, 0), '0,112'], 
    ['Italy', 'Fish', datetime.datetime(2020, 11, 17, 0, 0), '0,025'], 
    ['Italy', 'Fish', datetime.datetime(2020, 11, 17, 0, 0), '0,224'],
    ['Italy', 'Fish', datetime.datetime(2020, 11, 17, 0, 0), '0,256'],
    ['Italy', 'Fish', datetime.datetime(2020, 11, 17, 0, 0), '0,245']]

max_prices_by_country = {}

for item in my_list:
    price = max_prices_by_country.setdefault(item[0], 0)
    max_prices_by_country[item[0]] = max(price, float(item[-1].replace(',', '.')))

max_price_per_list = [str(price).replace('.', ',') for price in max_prices_by_country.values()]
print(max_price_per_list)

你需要的是:

  max_price_per_list = []
  for lst in my_list:
      max_value = lst[-1]
      max_price_per_list.append(max_value)
  print(max_price_per_list)

所以只有一个for循环。

您在做什么:使用第一个 for 循环,您将遍历列表中的列表。 使用第二个 for 循环,您将遍历该列表中的单个项目。 然后,您将获取该项目的最后一个元素。 由于字符串是可迭代的,您可以执行'Morocco'[-1]它将返回o ,因为这是字符串的最后一项。 但是,日期时间 object 不允许下标。 即您不能在日期时间 object 上执行[-1] 这就是为什么它只与日期时间 object 而不是字符串对象崩溃的原因。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM