You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

使用Python Filter函数按指定索引分类列表并按需输出

解决Python列表按人口分类及按标识筛选的问题

看起来你是在合并多个列表后,想要基于人口数据(索引1)做分类,还能按名称或原列表标识来筛选输出。我来给你一步步拆解解决方案,先从示例场景入手,这样更容易理解:

先明确你的数据结构(假设)

首先我先模拟你的数据情况,假设三个原列表是这样的(每个子列表包含「地区名/标识」和「人口数」):

list1 = [['Georgia', 10711908], ['Alabama', 5024279]]
list2 = [['Texas', 29145505], ['Oklahoma', 3959353]]
list3 = [['California', 39237836], ['Nevada', 3143991]]

# 合并成大列表
the_list = list1 + list2 + list3

一、按索引1(人口数据)分类

1. 用filter筛选特定人口范围的项

如果你想筛选符合某个人口条件的项(比如人口超过1000万),可以直接用filter结合lambda表达式:

# 筛选人口≥1000万的地区
pop_over_10m = list(filter(lambda x: x[1] >= 10000000, the_list))
print(pop_over_10m)
# 输出: [['Georgia', 10711908], ['Texas', 29145505], ['California', 39237836]]

2. 按人口区间分组

如果需要把列表分成多组(比如<500万、500万-1亿、>1亿),可以用字典来存储分组结果,同样结合filter:

pop_groups = {
    "under_5m": list(filter(lambda x: x[1] < 5000000, the_list)),
    "5m_to_10m": list(filter(lambda x: 5000000 <= x[1] < 10000000, the_list)),
    "over_10m": list(filter(lambda x: x[1] >= 10000000, the_list))
}

# 查看某一组的结果
print(pop_groups["under_5m"])
# 输出: [['Oklahoma', 3959353], ['Nevada', 3143991]]

二、按索引0(名称/原列表标识)输出

这里要分两种情况:按地区名(比如'Georgia')筛选,或者按原列表名称(比如'list1')筛选。后者需要你在合并时保留原列表的标识。

1. 按地区名(索引0)筛选

直接用filter或列表推导式就能实现,列表推导式有时候更直观:

# 用filter找Georgia
georgia_item = list(filter(lambda x: x[0] == 'Georgia', the_list))

# 或者用列表推导式(推荐,可读性更强)
georgia_item = [item for item in the_list if item[0] == 'Georgia']

print(georgia_item)
# 输出: [['Georgia', 10711908]]

2. 按原列表名称(比如'list1')筛选

如果你想区分每个项来自哪个原列表,合并时要给每个子项加上原列表的标记,比如新增一个元素存原列表名:

# 合并时带上原列表标识
the_list_with_source = []
for source_name, sub_list in [("list1", list1), ("list2", list2), ("list3", list3)]:
    for item in sub_list:
        # 把原列表名加到子列表末尾(索引2的位置)
        the_list_with_source.append(item + [source_name])

# 现在每个子列表结构是:[地区名, 人口, 原列表名]

然后就可以按原列表名筛选了:

# 筛选所有来自list1的项
list1_items = list(filter(lambda x: x[2] == 'list1', the_list_with_source))

# 或者列表推导式
list1_items = [item for item in the_list_with_source if item[2] == 'list1']

print(list1_items)
# 输出: [['Georgia', 10711908, 'list1'], ['Alabama', 5024279, 'list1']]

小提示

  • 如果你觉得lambda写起来麻烦,列表推导式在大多数情况下可读性更好,推荐使用
  • 确保合并后的每个子列表结构完全一致,不然filter的时候会因为索引不存在报错
  • 如果你的人口数据是字符串类型,记得先转换成整数再做比较!

内容的提问来源于stack exchange,提问作者Joseph

火山引擎 最新活动