Multiplying every second number in a list
我需要能够将列表中的每一个数字乘以2,所以说:
我想把这个还给[1,4,3,8],但是我试过的所有方法,比如
1 2 3 4 5
| credit_card = [int(x) for x in input().split()]
credit_card[::2] = [x*2 for x in credit_card[::2]]
print(credit_card) |
如果在返回[2,2,6,4]之前输入相同的列表
有没有一种方法来完成我想要完成的事情?
- 可能重复了我如何通过两个循环遍历python列表?
- 只是一个方便的提示:避免使用内置名称命名变量,如list、dict、id等。(这里你用的是大的L,所以不是这样的问题,而是一个变量should_look_like_this和ClassesAreWrittenLikeThis。使代码更易读,并且在路上省去了麻烦
就快到了,只需从第二个(1个索引)元素开始:
1
| credit_card[1::2] = [x*2 for x in credit_card[1::2]] |
也就是说,由于您似乎正在实现lunh校验和,所以您只需要这些数字的总和,而不需要更新原始数据,如本例中所做的那样。
- 只是对op的一个简短解释:一般语法是credit_card[start:stop:step]。[::2]表示"从开始到停止,步骤为2,[2::2]表示"从第3个元素开始,到结束,步骤为2。
1 2 3
| lst = [1,2,3,4]
new_lst = [2*n if i%2 else n for i,n in enumerate(lst)] # => [1, 4, 3, 8] |
- 我认为如果你使用1*x = x而不是0 = False的话,你可以减少更多的数量。
- 我不明白你的评论和我的回答有什么关系?
- 使用(i%2 + 1) * n…
- 啊…这会起作用,而且由于没有分支,可能(非常轻微)更快。但我认为可读性的降低超过了任何代码长度或速度的提高:-/
- 只是为了说明两个值得记住的属性可以"解决"这个问题:—)
1 2 3 4
| >>> l = [1,2,3,4]
>>>
>>> list(map(lambda x: x*2 if l.index(x)%2 else x, l))
[1, 4, 3, 8] |
1 2 3
| for i,_ in enumerate(credit_card):
if i%2:
credit_card[i] *= 2 |
或者如果你想成为一个花哨的人:
1
| credit_card=[credit_card[i]*(2**(i%2)) for i in range(len(credit_card))] |
使用Enumerate的另一个解决方案:
1
| [i* 2 if p % 2 else i for p, i in enumerate(l)] |
其中i是l的p元素。
- 好答案。把item改成i(现在不行了):)
- @spoor,@nander speerstra:%运算符的用途是什么?
- @乔恩。基本上,通过检查除以2的余数是否为0(偶数)来检查位置是偶数还是奇数(奇数)。
- @索普:所以你可以说是if p % 2而不是if p % 2 == 0,是因为python把0值作为一个真实的值,1作为一个错误的值……正确的?意味着0通过了if,而任何其他值都失败了。
- @乔恩,现在:如果索引是奇数,使用p*2(否则:p)。如果你说if p % 2 == 0,你就得把if/else颠倒过来:i if p % 2 == 0 else i*2。现在你说:如果索引是偶数,打印p(否则:使用p*2)。这是一个你喜欢在if和else中做什么的问题…
- @南德斯·佩斯特拉:对——把它倒过来。我想问的是,if p % 2 == 1是否等同于if p/2 == 1…或者换句话说,%操作符做什么?
- 否:8/2==1将返回False,7/2==1也将返回(事实上,只有p=2才会返回)。但8%2为0,7%2为1。
- 简单地说,模运算符(其他解释)对p%x说:从p中尽可能长地提取x。所以8%2=>8,然后6,然后4,然后0。完成。7%2=>7,然后5,然后3,然后1,完成(因为1-2将返回一个负数)。
- @南德斯佩斯特拉:啊,我明白了!谢谢
1 2 3 4 5 6
| credit_card = input().split()
for x in len(credit_card)
if x % 2 != 0
credit_card[x] = credit_card[x] * 2
print (credit_card) |