Попытка использовать redu () и лямбду со списком, содержащим строки - PullRequest
4 голосов
/ 15 марта 2012

Я пытаюсь использовать функцию уменьшения питонов в списке, содержащем строки целых чисел.

print int("4")
\\Gives me 4 Good
print reduce(lambda x,  y: x*y,  [2, 3, 4])
\\Gives me 24 Good
print reduce(lambda x,  y: x*int(y),  ['2',  '3',  '4'])
\\Gives me 222222222222 What??

Я полагаю, что Reduce дает лямбда-функции нечто, не являющееся фактической строкой в ​​списке? Я понятия не имею, почему я получаю 222222222222, по крайней мере, будет ли простой способ сделать список int? Думаю, я мог бы просто провести еще один цикл, но я все еще хотел бы знать, что не так с передачей строк.

Ответы [ 4 ]

7 голосов
/ 15 марта 2012
>>> reduce(lambda x,  y: x*int(y),  ['2',  '3',  '4'])
'222222222222'

Хорошо, вот что происходит:

На первом шаге уменьшения выполняется следующий расчет: '2' * 3. Поскольку первый операнд является строкой, он просто повторяется 3 раз. Таким образом, вы в конечном итоге с '222'.

На втором шаге уменьшения это значение умножается на 4: '222' * 4. Снова, строка повторяется четыре раза, что приводит к '222222222222', который является именно тем результатом, который вы получили.

Этого можно избежать, либо преобразовав x в целое число (вызывая int(x)), либо сопоставив элементы списка с помощью целочисленного преобразования в первую очередь (на самом деле я думаю, что это более элегантно):

>>> reduce(lambda x, y: x * y, map(int, ['2', '3', '4']))
24
4 голосов
/ 15 марта 2012

Вы можете попробовать это:

reduce(lambda x,  y: x*int(y),  ['2',  '3',  '4'], 1)

Обратите внимание, что я передаю третий параметр reduce, указывающий, что операция должна быть инициализирована в 1, мультипликативном тождестве.Таким образом, вам нужно только преобразовать y, значение current в int, а не x, накопленное значение.

1 голос
/ 15 марта 2012

Вы умножаете строку '2' на int 3, что дает строку '222' ... затем строку '222' на int 4, что дает строку '222222222222'.

Вам необходимо преобразовать x в целое число:

print reduce(lambda x,  y: int(x)*int(y),  ['2',  '3',  '4'])
0 голосов
/ 15 марта 2012
multiply = lambda a,b: a*b
listOfInts = map(int, ['2','3','4'])

reduce(multiply, listOfInts)  #output: 24
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...