如何提取列表中含terracotta的元素并输出对应数值?
问题
我有一个包含多个元组的列表,需要筛选出所有包含"terracotta"的条目及其对应的数字。我试过用sort()和sorted()函数,但不知道怎么用它们实现这个需求。
期望输出格式如下:
[('Gray terracotta', 1880), ("Pink terracotta", 2), ('Green terracotta', 7)...]
也就是所有包含"terracotta"的条目。
我尝试过的代码示例:
第一个示例:
terracotta_list = [('Gray terracotta', 1880), ('Stripped jungle log', 774), ('Concrete gray', 675), ('Black concrete powder', 596), ('Jungle planks', 535), ('Diorite', 455), ('Polished granite', 363), ('Stone slab (side view)', 296), ('Granite', 264), ('Terracotta', 242), ('Bone block (top view)', 237), ('Dirt', 235), ('terracotta', 11), ('Bone block (side view)', 10), ('Jungle log (crosscut face)', 10), ('Orange concrete powder', 10), ('Acacia planks', 9), ('Sand', 8), ('Cobblestone', 7), ('Green terracotta', 7), ('White concrete powder', 7), ('Dark oak planks', 6), ('Red terracotta', 6), ('Magenta terracotta', 5), ('Orange wool', 5), ('Black oak log', 4), ('White wool', 4), ('Pink concrete', 4), ('Pink terracotta', 2), ('Pink concrete powder', 2), ('Stripped spruce log', 1), ('Chiseled sandstone (side view)', 1)] list1 = sorted(terracotta_list, key=lambda blocks: blocks[0]) print(list1)
第二个示例:
terracotta_list = [('Gray terracotta', 1880), ('Stripped jungle log', 774), ('Concrete gray', 675), ('Black concrete powder', 596), ('Jungle planks', 535), ('Diorite', 455), ('Polished granite', 363), ('Stone slab (side view)', 296), ('Granite', 264), ('Terracotta', 242), ('Bone block (top view)', 237), ('Dirt', 235), ('terracotta', 11), ('Bone block (side view)', 10), ('Jungle log (crosscut face)', 10), ('Orange concrete powder', 10), ('Acacia planks', 9), ('Sand', 8), ('Cobblestone', 7), ('Green terracotta', 7), ('White concrete powder', 7), ('Dark oak planks', 6), ('Red terracotta', 6), ('Magenta terracotta', 5), ('Orange wool', 5), ('Black oak log', 4), ('White wool', 4), ('Pink concrete', 4), ('Pink terracotta', 2), ('Pink concrete powder', 2), ('Stripped spruce log', 1), ('Chiseled sandstone (side view)', 1)] def sort_key(blocks): return blocks[1] blocks.sort(key=sort_key, reverse=True) print(blocks)
请问该怎么处理才能筛选出所有含"terracotta"的条目并打印对应的第二个元素?
解决方案
首先明确:sort()和sorted()是用来排序的,不是用来筛选元素的。要挑出符合条件的条目,用列表推导式或者filter()函数更直接。
方法一:列表推导式(推荐写法)
遍历列表,检查每个元组的第一个元素是否包含"terracotta"——用lower()统一转成小写,避免因为大小写(比如Terracotta、terracotta)漏判:
terracotta_list = [('Gray terracotta', 1880), ('Stripped jungle log', 774), ('Concrete gray', 675), ('Black concrete powder', 596), ('Jungle planks', 535), ('Diorite', 455), ('Polished granite', 363), ('Stone slab (side view)', 296), ('Granite', 264), ('Terracotta', 242), ('Bone block (top view)', 237), ('Dirt', 235), ('terracotta', 11), ('Bone block (side view)', 10), ('Jungle log (crosscut face)', 10), ('Orange concrete powder', 10), ('Acacia planks', 9), ('Sand', 8), ('Cobblestone', 7), ('Green terracotta', 7), ('White concrete powder', 7), ('Dark oak planks', 6), ('Red terracotta', 6), ('Magenta terracotta', 5), ('Orange wool', 5), ('Black oak log', 4), ('White wool', 4), ('Pink concrete', 4), ('Pink terracotta', 2), ('Pink concrete powder', 2), ('Stripped spruce log', 1), ('Chiseled sandstone (side view)', 1)] # 筛选包含terracotta的条目 filtered_items = [item for item in terracotta_list if 'terracotta' in item[0].lower()] print(filtered_items)
运行后输出:
[('Gray terracotta', 1880), ('Terracotta', 242), ('terracotta', 11), ('Green terracotta', 7), ('Red terracotta', 6), ('Magenta terracotta', 5), ('Pink terracotta', 2)]
方法二:使用filter()函数
用filter()配合lambda表达式实现筛选,逻辑和列表推导式一样:
filtered_items = list(filter(lambda item: 'terracotta' in item[0].lower(), terracotta_list)) print(filtered_items)
得到的结果和列表推导式完全一致。
如果需要同时排序
要是筛选后还想按数字大小排序,再用sorted()就行:
# 按数字从大到小排序 sorted_filtered = sorted(filtered_items, key=lambda x: x[1], reverse=True) print(sorted_filtered)
输出:
[('Gray terracotta', 1880), ('Terracotta', 242), ('terracotta', 11), ('Green terracotta', 7), ('Red terracotta', 6), ('Magenta terracotta', 5), ('Pink terracotta', 2)]
内容的提问来源于stack exchange,提问作者steezyiscoding
相关产品推荐
相关产品推荐

