迭代时无法更改列表

时间:2017-08-09 17:40:13

标签: python list

嘿伙计们我的目标是通过制作一个我可以在vim中使用的简单工具箱来开始学习python。这是我尝试制作二进制到十进制计算器,但我似乎无法在迭代时更改我的列表。我是来自C的蟒蛇初学者。谢谢。 这就是我在心理上要做的事情:

100 - > [1,0,0] - > [1 * 2 ^ 2,0 * 2 ^ 1,0 * 2 ^ 0] - > 4 + 0 + 0 = 4

 import sys

 #binary to decimal

 print("Needs to be ran in python3\n")
 print("Value:")

 digits=input()
 # add except statement here
 length=len(digits)-1
 digits = [int(x) for x in str(digits)]

print(digits)

for x in range(len(digits)):
      digits=x*(2**length)
      length=length-1

sum=sum(digits)
print(sum)

2 个答案:

答案 0 :(得分:3)

该行

digits=x*(2**length)

表示“设置变量digits以保留x*(2**length)”。由于digits是您必须访问数字列表的唯一方法,并且您刚刚使其保持一个数字,因此您将无法访问列表的其余部分(并且Python意识到这一点并销毁列表)。相反,您似乎想要设置x的{​​{1}}元素,可以使用digits访问该元素。这意味着您想要的行

digits[x]

然而,这不是实现这一目标的最佳方式。首先,你只是将一堆数字加在一起;在不更改列表的情况下更容易做到这一点。例如:

digits[x] = digits[x]*(2**length)

(我将变量名称从total = 0 for x in range(len(digits)): total += digits[x] * (2**length) length=length-1 print(total) 更改为sum,因为覆盖内置名称通常是一个坏主意)

请注意,现在我们访问total的唯一方法是致电x。迭代列表本身而不是索引通常更惯用:

digits[x]

这个循环可以简化为根本不需要total = 0 for digit in digits: total += digit * (2**length) length=length-1 print(total) 变量:

length

首先将total = 0 for digit in digits: total *= 2 total += digit print(total) 加倍,然后将下一个数字添加到其中。这更具可读性(因为total因为名称通常表示长度,它不会改变,因此减少它看起来很奇怪)并且即使我们不知道有多少也能工作我们有数字。

另一个注意事项是如何生成length列表:

digits

此时,digits = [int(x) for x in str(digits)] 已经是digits(因为它是str的结果),因此您无需通过调用{{1}来转换它};只要说input()

最后,对所有这些都有一种更简单的方法。如果我们在Python解释器中运行命令str,我们会看到[int(x) for x in digits]构造函数记录如下:

  

help(int)
   int

     

将数字或字符串转换为整数,如果没有参数则返回0    给出。如果int(x=0) -> integer是一个数字,请返回int(x, base=10) -> integer。对于浮点    数字,这会截断为零。

     

如果x不是数字或者是否给出了基数,则x.__int__()必须是字符串,    bytes或bytearray实例,表示中的整数文字    给定基数。文字可以在xx之后加以包围    通过空白。基数默认为10.有效基数为0和2-36。    基数0表示将字符串中的基数解释为整数文字。

'+'

这意味着你可以制作整个节目

'-'

当然,这个版本在你开始学习Python的既定目标方面做得并不好。

答案 1 :(得分:0)

任何机会,你的意思是写

digits[x] = x*(2**length) 
在你的for循环中

?由于列表中的digits,您基本上将整个digits列表设置为for循环中的单个值。试试看,看看是否有效。