Вопрос-Ответ

Python for-in loop preceded by a variable [duplicate]

Циклу Python for -in предшествует переменная [дубликат]

Я видел такой код, как:

foo = [x for x in bar if x.occupants > 1]

Что это значит и как это работает?

Переведено автоматически
Ответ 1

Текущие ответы хороши, но не говорят о том, что они являются просто синтаксическим сахаром для некоторого шаблона, к которому мы так привыкли.

Давайте начнем с примера, допустим, у нас есть 10 чисел, и нам нужно подмножество тех, которые больше, скажем, 5.

>>> numbers = [12, 34, 1, 4, 4, 67, 37, 9, 0, 81]

Для вышеупомянутой задачи приведенные ниже подходы полностью идентичны друг другу и варьируются от наиболее подробных до кратких, удобочитаемых и питоновских:

Подход 1

result = []
for index in range(len(numbers)):
if numbers[index] > 5:
result.append(numbers[index])
print result #Prints [12, 34, 67, 37, 9, 81]

Подход 2 (немного более чистый, циклы for-in)

result = []
for number in numbers:
if number > 5:
result.append(number)
print result #Prints [12, 34, 67, 37, 9, 81]

Подход 3 (понимание списка ввода)

result = [number for number in numbers if number > 5]

или в более общем смысле:

[function(number) for number in numbers if condition(number)]

где:


  • function(x) принимает x и преобразует его во что-то полезное (например: x*x)

  • если condition(x) возвращает любое значение False-y (False, None, пустая строка, пустой список и т.д.), то текущая итерация будет пропущена (подумайте continue). Если функция возвращает значение, отличное от False-y, то текущее значение попадает в конечный результирующий массив (и проходит этап преобразования, описанный выше).

Чтобы немного иначе понять синтаксис, ознакомьтесь с дополнительным разделом ниже.

Для получения дополнительной информации следуйте руководству, на которое ссылаются все остальные ответы: Понимание списка


Бонус

(Немного не по-питоновски, но помещаю это здесь для полноты картины)

Приведенный выше пример можно записать как:

result = filter(lambda x: x > 5, numbers)

Общее выражение, приведенное выше, может быть записано как:

result = map(function, filter(condition, numbers)) #result is a list in Py2
Ответ 2

Это понимание списка

foo будет отфильтрованный список bar, содержащий объекты с атрибутом occupants > 1

bar может быть list, set, dict или любым другим итерируемым

Вот пример для пояснения

>>> class Bar(object):
... def __init__(self, occupants):
... self.occupants = occupants
...
>>> bar=[Bar(0), Bar(1), Bar(2), Bar(3)]
>>> foo = [x for x in bar if x.occupants > 1]
>>> foo
[<__main__.Bar object at 0xb748516c>, <__main__.Bar object at 0xb748518c>]

Итак, у foo есть 2 Bar объекта, но как нам проверить, какие это? Давайте добавим __repr__ метод в Bar, чтобы он был более информативным

>>> Bar.__repr__=lambda self:"Bar(occupants={0})".format(self.occupants)
>>> foo
[Bar(occupants=2), Bar(occupants=3)]
Ответ 3

Поскольку на программную часть вопроса другие ответили полностью, было бы неплохо узнать его отношение к математике (теория множеств). На самом деле это реализация на Python нотации Set builder:


Определение набора с помощью аксиомы спецификации:


B = { x є A : S(x) }


Перевод с английского: B - это множество, члены которого выбираются из A, поэтому B является подмножеством A (B ⊂ A), где выполняется характеристика (ы), указанная функцией S: S(x) == True


Определение B с использованием понимания списка:


B = [x для x в A, если S(x)]


Итак, для построения B с пониманием списка, элементы B (обозначаемые x) выбираются из набора A, где S(x) == True (условие включения).

Примечание: Функция, S которая возвращает логическое значение, называется предикатом.

Ответ 4

Это возвращает список, содержащий все элементы в bar, которые занимают > 1.

2023-12-17 13:50 python