Поиск минимума во втором столбце кортежа во вложенном списке с целыми числами и кортежами

#python-3.x #tuples #list-comprehension #nested-lists #minimum

#python-3.x #кортежи #список-понимание #вложенные списки #минимум

Вопрос:

У меня есть вложенный список целых чисел и кортежей:

 orders = [[1, ('5464', 49.96), ('8274', 233.82), ('9744', 404.55)]
          [2, ('5464', 99.91), ('9744', 404.55)]
          [3, ('5464', 99.91), ('88112', 274.89)]
          [4, ('8732', 93.93), ('7733', 208.89), ('88112', 199.75)]]
 

Я хочу получить минимум (вывод):

 [(1, '5464')
 (2, '5464')
 (3, '5464')
 (4, '8732')]
 

Как мне получить вывод, используя только понимание списка (без циклов и других функций)?

 My try:
p = [[x if type(x) != tuple else min(y[1:])[1] for x in y] for y in orders]
print(p)

output:
[[1, 49.96, 49.96, 49.96], [2, 99.91, 99.91], [3, 99.91, 99.91], [4, 208.89, 208.89, 208.89]]
 

Ответ №1:

Мы можем использовать срезы, чтобы отделить первый элемент от остальных элементов в каждом из внутренних списков. Обратите внимание, что каждый элемент orders является a list , поэтому проверка типов не требуется. Мы можем использовать срез, чтобы отделить первый элемент от остальных элементов, поскольку первый элемент отличается.

Итак, в понимании списка мы выводим кортеж, где для каждого списка lst , содержащегося в orders , мы

  • Использовать lst[0] в качестве первого элемента в нашем кортеже
  • возьмите min(lst[1:]) остаток от lst (конечно, вы можете использовать пользовательский key здесь, если хотите). Это приведет к получению 2-х кортежей, подобных ('5464', 49.96)
    • Возьмите [0] th элемент того, который будет '5464' в этом примере.

Это дает результат, который вы ищете:

 orders = [
    [1, ('5464', 49.96), ('8274', 233.82), ('9744', 404.55)],
    [2, ('5464', 99.91), ('9744', 404.55)],
    [3, ('5464', 99.91), ('88112', 274.89)],
    [4, ('8732', 93.93), ('7733', 208.89), ('88112', 199.75)],
]
output = [(lst[0], min(lst[1:])[0]) for lst in orders]
print(output)
# [(1, '5464'), (2, '5464'), (3, '5464'), (4, '7733')]
 

Комментарии:

1. Привет, вывод 4 не является ожидаемым результатом.

2. Почему это, 4-й элемент является максимальным, а не минимальным? Понимание списка выглядит правильно.

3. Я получил решение, которое выводит правильный 4-й элемент, outplut = [(lst[0], min(lst[1:], key=lambda x:x[1])[0]) для lst в порядках]