У меня есть список замороженных наборов, которые я хотел бы отсортировать. Каждый из замороженных наборов содержит одно целочисленное значение, полученное в результате операции пересечения двух наборов:

k = frozenset(w) & frozenset(string.digits)
d[k] = w # w is the value
list(d) # sorted(d) doesn't work since the keys are sets and sets are unordered.

Вот распечатанный список:

[frozenset({'2'}), frozenset({'1'}), frozenset({'4'}), frozenset({'3'})]

Как я могу отсортировать список, используя значения, содержащиеся в наборах?

1
Kiragu 4 Фев 2022 в 11:54

2 ответа

Вам нужно предоставить функцию как key для sorted, которая будет принимать frozenset в качестве аргумента и возвращать что-то, что можно сравнить. Если каждый frozenset имеет ровно 1 элемент, а указанный элемент всегда однозначный, вы можете использовать функцию max (она извлечет этот единственный элемент, так как единственный элемент всегда является самым большим элементом frozenset) это

d1 = [frozenset({'2'}), frozenset({'1'}), frozenset({'4'}), frozenset({'3'})]
d2 = sorted(d1,key=max)
print(d2)

Выход

[frozenset({'1'}), frozenset({'2'}), frozenset({'3'}), frozenset({'4'})]

Если вы хотите узнать больше, прочитайте Sorting How to

2
Daweo 4 Фев 2022 в 12:00

Предыдущие ответы не могут быть правильно отсортированы из-за строк

d = [frozenset({'224'}), frozenset({'346'}), frozenset({'2'}), frozenset({'22345'})]
sorted(d, key=lambda x: int(list(x)[0]))

Выход:

[frozenset({'2'}),
 frozenset({'224'}),
 frozenset({'346'}),
 frozenset({'22345'})]
1
Mazhar 4 Фев 2022 в 12:08
1
Хороший момент (я не понял, что это строки), однако лучше использовать для этого natsorted (см. мое обновление)
 – 
mozway
4 Фев 2022 в 12:41
1
Кирагу создает frozenset с помощью frozenset(w) & frozenset(string.digits), что всегда будет давать однозначные числа
 – 
Daweo
4 Фев 2022 в 13:07