返回一组二进制矢量关联列表的补集

2024-04-24 22:39:36 发布

您现在位置:Python中文网/ 问答频道 /正文

我必须解决这个问题:

能否实现函数,并将两个关联向量(在Python中表示为二进制列表)作为参数,并返回这两个向量的补码?

es和(11001110)=1100

所以我有这样的情况:

def AND(vector_a, vector_b):
    # insert your code here

# these tests should return True if your code is correct
print(AND([1, 1, 0, 0], [1, 1, 1, 0]) == [1, 1, 0, 0])
print(AND([1, 0, 0, 1, 0, 0, 1], [1, 1, 1, 0, 1, 0, 1]) == [1, 0, 0, 0, 0, 0, 1])

我的解决方案是:

def AND(va,vb):
    lista = []
    i = 0
    while i<len(va):
        if va[i] == 1 and vb[i]==1:
            lista.append(1)
        else:
            lista.append(0)
        i += 1
    return lista

这似乎是可行的,但在接下来的练习中,我遇到了一些问题:

重写函数并允许它采用任意数量的关联向量。

def AND(*vectors):
    # insert your code here    

# these tests should return True if your code is correct
print(AND([1, 1, 0, 0], [1, 1, 1, 0], [1, 0, 0, 0]) == [1, 0, 0, 0])
print(AND([1, 1, 1, 0, 1], [1, 0, 0, 1, 0], [0, 1, 1, 0, 1]) == [0, 0, 0, 0, 0])

你能帮我解决这个问题吗?谢谢


Tags: and函数yourreturnifheredefcode
3条回答

下面是一个干净的解决方案,隐藏列表理解和生成器表达式中的所有循环:

def AND(*vectors):
    N = len(vectors[0])  # Get the length of the vectors
    return [int(all(vec[i] for vec  in vectors)) for i in range(N)]

all函数检查所有向量的第i元素是否都是1(或者除0以外的任何值)。它返回TrueFalse。我们可以使用int函数将其转换为10。你知道吗

以下是您如何概括您迄今为止所做的工作:

def AND(*vectors):
    lista = []
    i = 0
    while i<len(vectors[0]):
        # add a temporary variable to check
        # if all i elements are ones 
        all_ones = True
        for v in vectors:
            all_ones = all_ones and v[i] == 1
        if all_ones:
            lista.append(1)
        else:
            lista.append(0)
        i += 1
    return lista

我建议您使用zip进行这些操作。因此,您可以对任意数量的列表执行此操作。你知道吗

a = [1, 0, 0, 1]
b = [0, 1, 1, 1]
c = [0, 0, 0, 1]

results = []
for val in zip(a, b, c):
    results.append(int(all(val)))

print results

基本上zip所做的是,它根据列表中的元素的索引(列)来对其进行zip,您可以将其视为矩阵转置。你知道吗

所以a,b,c的压缩版本是

(1, 0, 0)
(0, 1, 0)
(0, 1, 0)
(1, 1, 1)

所有需要处理的值都打包在元组中。然后使用all对这些项应用and操作,基本上all检查容器的所有元素是否都是1,如果只有一个0,它返回false,因此and就满足了。你知道吗

这就回来了

False
False
False
True

但是你需要整数值,所以int(all(val))

0
0
0
1

有关anyall的详细信息:

https://docs.python.org/3.4/library/functions.html#any

https://docs.python.org/3.4/library/functions.html#all

相关问题 更多 >