Проверьте, являются ли все элементы во вложенном списке положительными или отрицательными в python - PullRequest
0 голосов
/ 26 апреля 2020

Я пытаюсь использовать понимание списка, чтобы найти вложенный список, все элементы которого положительны, но я не уверен, как сформулировать условное выражение, чтобы проверить все значения во вложенном списке для понимания списка.

records = [[-167.57, 4.0, 61.875, -100.425],
 [-1.75, 3.75, 4.0],
 [7612.875, 10100.0, 74.25, 1.75, 61.875],
 [-2333.37, -5404.547500000001, -5178.645833333333, 97.0, 167.57],
 [-96.99999999999997, -5277.999999999999, -4998.5, 74.25, 3.75]]

answer = [i for i in records if (n < 0 for n in i)]
answer

Я думаю, что это утверждение, которое я пытаюсь превратить в код: «если все n> 0 для n в i, вернуть индекс i»

edit: вывод будет возвращать индекс соответствующая строка всех положительных чисел

Ответы [ 3 ]

2 голосов
/ 27 апреля 2020

Вы рядом. Представьте, как бы вы сделали это в al oop:

for index, row in enumerate(records):
    if all(col > 0 for col in row): 
        print(index)

Условие if с all возвращает True, если все элементы являются только положительными. Теперь поместите это в форму обработки списка:

answer = [
    index 
    for index, row in enumerate(records) 
    if all(col > 0 for col in row)
]
# [2]

Понимания списка - это оптимизированные версии циклов for, специально предназначенные для создания списков. Обычно существует взаимно-однозначный перевод между al oop, генерирующим список, и пониманием списка. Мой совет, когда вы застряли в синтаксисе списка компов, сделать шаг назад и визуализировать, как это выглядит просто для l oop. Вот два важных правила оптимизации (как мне сказал мой наставник в университете):

  1. Не оптимизировать
  2. Пока не оптимизировать
1 голос
/ 27 апреля 2020

Вы можете использовать встроенный метод all, который

Возвращает True, если все элементы итерируемого являются истинными (или если итерируемое пусто)

  • для всех отрицательных

    answer = [all(n < 0 for n in i) for i in records] # [False, False, False, False, False]
    
  • для всех положительных

    answer = [all(n > 0 for n in i) for i in records] # [False, False, True, False, False]
    

Чтобы получить индексы всех положительных строк , объедините с enumerate

answer = [idx for idx,row in enumerate(records) if all(n > 0 for n in row)] # [2]
1 голос
/ 26 апреля 2020

Вы можете использовать all, чтобы проверить, удовлетворяют ли все элементы заданному условию, например,

answer = [all(n > 0 for n in lst) for lst in records]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...