返回list [python]中每次按位和连续元素的值



我需要通过将a[I]与a[I +1]进行位与比较来打印[72,8,0](并添加,sub,*就像知道的那样),我面临的错误是'列表索引超出范围'。我尝试了递归,但是它打印了整个值。

a=[123,456,654,4]
arr=[]
for i in range(len(a)):
ass=a[i]&a[i+1]
arr.append(ass)
print(arr) 

我是编程新手。在我学习的过程中,我遇到了很多列表理解的方法(python)。我需要知道所有可能的方法,就像作弊码一样。是否有==正确的,请附上链接

您当前的解决方案存在问题,您修改了函数之外的某些内容,这通常是不明智的

>>> arr = []
>>> a = [123, 456, 654, 4]
>>> b=a[0]
>>> arr = []
>>> def recurs(b):
for i in range(len(a)-1):
b=b&a[i+1]
arr.append(b)
return b
>>> recurs(b)
0
>>> arr
[72, 8, 0]
>>> recurs(b)
0
>>> arr
[72, 8, 0, 72, 8, 0]
>>> 

因为对同一个函数的两个相同的调用应该产生相同的结果,尽管从技术上讲,函数的结果是相同的,但它所产生的副作用肯定是不希望的。

修复方法是函数本身在内部完成所有需要做的事情,而不依赖于可以轻松作为参数提供给它的外部事物

>>> arr = []
>>> def recur(data):
b = data[0]
arr = []
for a in data[1:]:
b = b&a
arr.append(b)
return arr
>>> a = [123, 456, 654, 4]
>>> recur(a)
[72, 8, 0]
>>> recur(a) #2 identical call, same result
[72, 8, 0]
>>> arr  # the arr outside wasn't touched, the function make its own inside
[]
>>>   
这里有几件事需要注意,列表、元组、字符串等等都可以直接用于for循环,在这种情况下,你可以直接在 元素上循环。
>>> for x in a:
print(x)

123
456
654
4
>>>     

切片表示法允许您获得列表的子列表

>>> a
[123, 456, 654, 4]
>>> a[:1]
[123]
>>> a[1:]
[456, 654, 4]
>>> a[1:3]
[456, 654]
>>> 

语法是mylist[start:end],其中start是您想要的初始索引,end是最终索引,两者都可以省略,并将使用适当的默认值,您可以在这里找到更多信息:common-sequence-operations

对于列表理解版本,在py3.8中引入海象操作符之前,它不容易完成,因为b在函数中使用的方式,即前一个结果影响下一个,除非你使用一些黑暗魔法或其他东西…

但是可以用

>>> def recur2(data):
b = data[0]
return [ (b := b&a) for a in data[1:] ]
>>> recur2(a)
[72, 8, 0]
>>>   

感谢@cooperfield让我接近答案。

a = [123, 456, 654, 4]
b=a[0]
arr = []
def recurs(b):
for i in range(len(a)-1):
b=b&a[i+1]
arr.append(b)
return b
recurs(b)
print(arr)

但是如果上面的代码有任何列表理解,请在

下面提到

相关内容

  • 没有找到相关文章

最新更新