[Вдохновлен этим вопросом]
Предположим, у меня есть два списка:
list1 = ['tom', 'mary', 'frank', 'joe', 'john', 'barry']
list2 = [1, 2, 3, 4]
Я хочу сопоставить каждое имя в list1
с числом в list2
. Поскольку в list2
есть четыре числа, я хотел бы соединить каждое из первых четырех имен с соответствующим числом в list2
и назначить случайные числа оставшимся именам в list1
.
Я знаю, что могу решить эту проблему, используя цикл for с enumerate
и random.choice
. Действительно, я предоставил такое решение исходной проблемы.
Однако я хотел бы знать, можно сделать что-то вроде этого:
for name, number in itertools.izip_longest(list1, list2, fillvalue=MAGIC):
print name, number
Первоначально я думал использовать что-то вроде этого:
MAGIC = random.choice(list1)
Однако сначала выполняется random.choice(list1)
, а затем используется ответ как fillvalue
для операции архивирования. Это непривлекательно, так как не выбирает новое случайное значение для каждой пары значений, которые он сжимает. Поэтому ясно, что itertools.izip_longest
требует для своего fillvalue
чего-то, что само по себе имеет значение, чего оно не вызывает. В самом деле, если бы я предоставил ему функцию, это дало бы пару, состоящую из имени и вызываемой функции, что также не требуется. По этой причине функции lambda
не являются возможными решениями.
Как мне создать переменную, которая вызывает некоторую функцию, когда она вызывается? Как itertools.izip_longest
использует переменную fillvalue
? Вызывается ли __repr__
этой переменной? Если да, могу ли я создать класс с __repr__
, который вызывает функцию внутри него?
__repr__
значения, когда вызывается, когда. Thus, if
__repr__` должен был вызвать какую-то внешнюю функцию, а затем внезапно у вас есть переменная, которая содержит экземпляр, значение которого определяется функцией . В остальном я действительно знаком с разницей между переменной и функцией. - person inspectorG4dget   schedule 07.02.2014izip_longest
не звонитrepr
. Он просто выплевывает объект напрямую. - person user2357112 supports Monica   schedule 07.02.2014__repr__
возвращала другое значение при каждом вызове. Кроме того, даже если бы это было так, подход izip_longets все равно не работал бы, поскольку значение fillvalue определяется при вызове функции, а не при каждом ее заполнении. - person Claudiu   schedule 07.02.2014fillvalue
, которое будет одно, когда вы посмотрите на него один раз, и другое, когда вы посмотрите на него снова. Откудаizip_longest
знать, что эта переменная должна просматриваться только определенное количество раз? Что, если бы предполагалось, что значение будет одинаковым каждый раз, а какой-то инвариант в коде C, управляющемizip_longest
, сломался и вызвал segfault? - person user2357112 supports Monica   schedule 07.02.2014