使用列表理解对具有有序数字的元素进行排序

sort elements with ordered number using list comprehensions

所以我正在尝试学习 python 中的列表理解,是否可以使用连续/有序数字对元素的值进行排序?给定以下数据是这样的

basket = {
    "basket1": [
        {"type": "Fruit", "name": "Melon"},
        {"type": "Goods", "name": "Hershey Bar"},
        ....
    ],
    "basket2": [
        {"type": "Fruit", "name": "Watermelon"},
        {"type": "Goods", "name": "Mineral"},
        ....
    ],
}

我目前的成绩:

1. Fruit
1.1 Melon
1.3 Watermelon
2. Goods
2.2 Hershey Bar
2.4 Mineral

预期结果如下:

1. Fruit
1.1 Melon
1.2 Watermelon
2. Goods
2.3 Hershey Bar
2.4 Mineral
# and so on

因为我尝试过的是这样的。

def object():
    data = basket["basket1"] + inventory["basket2"]

    # using list comprehensions
    fruits = [
        f"1.{i} {x['name']} \n" for i, x in enumerate(data, 1) if x["type"] == "Fruit"
    ]
    goods = [
        f"2.{i} {x['name']} \n" for i, x in enumerate(data, 1) if x["type"] == "Goods"
    ]

    if fruits and goods:
        print("1. Fruit: " + to_string(fruits))
        print("2. Goods: " + to_string(goods))

非常感谢您的支持。

在列表推导中使用另一个列表推导:

def object():
    data = basket["basket1"] + basket["basket2"]

    # using list comprehensions
    fruits = [
        f"1.{i} {x['name']} \n" for i, x in enumerate([d for d in data if d["type"] == "Fruit"], 1)
    ]
    goods = [
        f"2.{i} {x['name']} \n" for i, x in enumerate([d for d in data if d["type"] == "Goods"], 1)
    ]

    if fruits and goods:
        print("1. Fruit: " + to_string(fruits))
        print("2. Goods: " + to_string(goods))

更有效的方法是使用生成器表达式:

def object():
    data = basket["basket1"] + basket["basket2"]

    # using list comprehensions
    fruits = [
        f"1.{i} {x['name']} \n" for i, x in enumerate((d for d in data if d["type"] == "Fruit"), 1)
    ]
    goods = [
        f"2.{i} {x['name']} \n" for i, x in enumerate((d for d in data if d["type"] == "Goods"), 1)
    ]

    if fruits and goods:
        print("1. Fruit: " + to_string(fruits))
        print("2. Goods: " + to_string(goods))

您好,欢迎来到 python,您将度过一生!
你有可能问吗?答案是 99.9% 是。让我们看看如何:
首先让我们尝试改变我们提供答案的策略。
与其遍历整个篮子,不如先将它们分类到不同的列表中,然后再枚举它们。

    def sort_it(baskets):
        aggregate = defaultdict(list)
        for _, items_list in basket.items():
            for item in items_list:
                aggregate[item["type"]].append(item["name"])

        for title, values, idx in enumerate(addregate.items(), 1):
            print(f"{idx}. {title}: ")
            for item, num on enumerate(values):
                print("{idx}.{num} item")

先排序再重命名如何?

fruit = []
goods = []
for item in basket.values():
    for element in item:
        if element['type'] == 'Fruit':
            fruit.append(element['name'])
        elif element['type'] == 'Goods':
            goods.append(element['name'])
        else:
            pass

fruit = [f"1.{i} {x}" for i, x in enumerate(fruit, 1)]
good = [f"2.{i} {x}" for i, x in enumerate(goods, len(fruit)+1)]

print("1. Fruit:\n" + '\n'.join(fruit))
print("2. Goods:\n" + '\n'.join(good))

>>>
1. Fruit:
1.1 Melon
1.2 Watermelon
2. Goods:
2.3 Hershey Bar
2.4 Mineral

您正在寻找数据的给定表示。 首先根据您的需要将您的数据设置为更实用的格式,然后根据所需格式进行打印。

from collections import defaultdict

# a dictionary which elements are initialized as lists by default
data = defaultdict(list)

# group data by type (Good, Fruits, ...)
for items in baskets.values():
    for item in items:
        data[item['type']].append(item['name'])
        
print(data)
defaultdict(<class 'list'>, {'Fruit': ['Melon', 'Watermelon'], 'Goods': ['Hershey Bar', 'Mineral']})
# Print the data with the wanted format
for i,(k,v) in enumerate(data.items()):
    print(f"{i+1} {k}")
    for j,item in enumerate(v):
        print(f"{i+1}.{j+1} item")
1 Fruit
1.1 item
1.2 item
2 Goods
2.1 item
2.2 item