Return列表中每次按位和连续元素的值[python]
Return the value of bitwise and of consecutive element each time in list [python]
我需要通过比较 a[i] 和 a[i+1] 来打印 [72,8,0]面对是 'list index out of range'。
我尝试使用递归,但它打印了整个值。
a=[123,456,654,4]
arr=[]
for i in range(len(a)):
ass=a[i]&a[i+1]
arr.append(ass)
print(arr)
我是编程新手。在学习过程中,我遇到了很多列表理解方式 (python)。我需要像作弊码一样知道所有可能的方法。有没有== True,请附上link
感谢@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)
但是如果上面的代码有任何列表理解请在下面提到
你当前的解决方案有问题,你修改了你的功能之外的东西,这通常是不明智的
>>> 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中引入the walrus operator之前,鉴于函数中使用b
的方式,即以前的结果,它并不容易完成影响下一个,除非你使用一些黑魔法什么的...
但是这样就可以完成
>>> def recur2(data):
b = data[0]
return [ (b := b&a) for a in data[1:] ]
>>> recur2(a)
[72, 8, 0]
>>>
我需要通过比较 a[i] 和 a[i+1] 来打印 [72,8,0]面对是 'list index out of range'。 我尝试使用递归,但它打印了整个值。
a=[123,456,654,4]
arr=[]
for i in range(len(a)):
ass=a[i]&a[i+1]
arr.append(ass)
print(arr)
我是编程新手。在学习过程中,我遇到了很多列表理解方式 (python)。我需要像作弊码一样知道所有可能的方法。有没有== True,请附上link
感谢@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)
但是如果上面的代码有任何列表理解请在下面提到
你当前的解决方案有问题,你修改了你的功能之外的东西,这通常是不明智的
>>> 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中引入the walrus operator之前,鉴于函数中使用b
的方式,即以前的结果,它并不容易完成影响下一个,除非你使用一些黑魔法什么的...
但是这样就可以完成
>>> def recur2(data):
b = data[0]
return [ (b := b&a) for a in data[1:] ]
>>> recur2(a)
[72, 8, 0]
>>>