使用列表理解对具有有序数字的元素进行排序
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
所以我正在尝试学习 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