#python #min
#python #min
Вопрос:
Как мне найти минимальные значения, исключая ноль, в этом списке, который имеет вложенные списки ниже?
lst = [[1, 5, 7], [8, 6, 3], [0, 2, 4], [0, 0, 0]]
Я попробовал эту функцию, но, очевидно, она покажет 0.
lst = [[1, 5, 7], [8, 6, 3], [0, 2, 4], [0, 0, 0]]
lst = list(map(min, *lst))
print(lst)
[0, 0, 0]
список следует рассматривать как
[1, 5, 7],
[8, 6, 3],
[0, 2, 4],
[0, 0, 0]
таким образом, ожидаемый результат должен быть
[1, 2, 3]
Комментарии:
1. Всегда есть один вложенный список или может быть несколько?
2. @Alderven только один
Ответ №1:
это вариант:
lst = [[1, 5, 7], [8, 6, 3], [0, 2, 4], [0, 0, 0]]
m = list(min(n for n in col if n != 0) for col in zip(*lst))
print(m) # [1, 2, 3]
если я правильно понимаю, вам нужен минимум каждого «столбца» вашего вложенного списка. zip(*lst)
позволяет перебирать столбцы; затем я просто выбираю минимум из них.
Комментарии:
1. Сортировка не требуется, ради этого я снова отредактировал свой вопрос.
2. просто сделать понимание, чтобы результат был [1, 2, 3]
3. да, это все, может быть, я плохо объяснил, спасибо.
Ответ №2:
Вы могли бы использовать понимание вложенного списка, сначала отфильтровав нулевые значения из вложенных списков и получая только минимальное значение из списков, в которых еще остались какие-либо элементы.
>>> lst = [[1, 5, 7], [8, 6, 3], [0, 2, 4], [0, 0, 0]]
>>> In [3]: [min(sub) for sub in ([x for x in sub if x] for sub in zip(*lst)) if sub]
[1, 2, 3]
Комментарии:
1. но это должно быть [1, 2, 3]
2. @user7716943 Хорошо, почему это должно быть
[1, 2, 3]
? Это не порядок минимальных элементов в списках. Если вам просто нужны минимальные элементы в отсортированном порядке, используйтеsorted
.3. нет, речь идет не о сортировке… вам нужно просмотреть его таким образом, чтобы вы сравнивали каждый из этих вложенных списков для каждого индекса, чтобы получить минимальное значение ….. таким образом, вы получаете минимальное значение из lst [0] [0] amp; lst [1] [0] amp; lst [2] [0] и так далеевключено…..
4. @user7716943 Ах, теперь я вижу. Исправлено.
Ответ №3:
lst = [[1, 5, 7], [8, 6, 3], [0, 2, 4], [0, 0, 0]]
flat_list =[i for j in lst for i in j]
flat_list.sort()
flat_list=list(set(flat_list))
min_val = flat_list[0] if flat_list[0]!=0 else flat_list[1]
print(min_val)
Ответ №4:
Вы можете использовать комбинацию chain
, filter (или понимание) и min:
min(x for x in itertools.chain.from_iterable(lst) if x != 0)
Ответ №5:
Немного слишком много comprehensions
:),
>>> x
[[1, 5, 7], [8, 6, 3], [0, 2, 4], [0, 0, 0]]
>>> vals = map(min, [k for k in [[z for z in y if z != 0] for y in x] if k])
>>> sorted(vals)
[1, 2, 3]
Слишком много ? Хорошо, меньше comprehensions
:),
>>> vals = map(min, [[v for v in y if v != 0] for y in x if not all(k==0 for k in y)])
>>> sorted(vals)
[1, 2, 3]