首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >每次返回list中连续元素的按位and的值[python]

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

Stack Overflow用户
提问于 2021-10-23 16:54:31
回答 2查看 29关注 0票数 0

我需要打印72,8,0,通过比较ai和ai+1的按位AND (以及加法,减法,* like ),我面临的错误是‘列表索引超出范围’。我尝试过递归,但它输出了整个值。

代码语言:javascript
复制
a=[123,456,654,4]
arr=[]
for i in range(len(a)):
    ass=a[i]&a[i+1]
    arr.append(ass)
print(arr) 

我是编程新手。在我学习的过程中,我遇到了许多列表理解(python)的方法。我需要知道所有可能的方式,比如作弊代码。有没有==是真的,请附上链接

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-10-24 16:23:15

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

代码语言:javascript
复制
>>> 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]
>>> 

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

修复方法是函数本身做它需要在内部做的所有事情,而不依赖于一些外部的东西,这些东西可以很容易地作为参数提供给它

代码语言:javascript
复制
>>> 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循环中使用,在这种情况下,可以直接在元素上循环

代码语言:javascript
复制
>>> for x in a:
        print(x)

    
123
456
654
4
>>>     

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

代码语言:javascript
复制
>>> 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在函数中的使用方式,这并不容易完成,也就是说,前一个结果会影响下一个结果,除非你使用一些黑魔法或其他什么……

但是有了它,in就可以这样做了。

代码语言:javascript
复制
>>> def recur2(data):
        b = data[0]
        return [ (b := b&a) for a in data[1:] ]

>>> recur2(a)
[72, 8, 0]
>>>   
票数 0
EN

Stack Overflow用户

发布于 2021-10-24 14:22:03

感谢@cooperfield找到我,接近答案。

代码语言:javascript
复制
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)

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69690191

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档