返回一个入射二元向量列表的补集

时间:2017-10-22 20:00:44

标签: python list

我必须解决这个练习:

你能实现函数AND作为参数两个入射向量(用Python表示二进制列表)并返回两者的补充吗?

和(1100,1110)= 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

这似乎有效,但现在对于下一次练习我有一些问题:

重写函数AND以允许它采用任意数量的入射矢量。

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])
你可以帮我解决这个问题吗?感谢

3 个答案:

答案 0 :(得分:2)

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

AUTH_USER_MODEL = '<app_name>.User'

基本上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 的作用是,它根据索引(列)拉伸列表的元素,你可以认为它是一个矩阵转置。

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

zip

您需要处理的所有值都包含在元组中。然后使用(1, 0, 0) (0, 1, 0) (0, 1, 0) (1, 1, 1) 对这些项应用all操作,基本上and检查容器的所有元素是否为all,如果有一个1 0 1}},它返回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

答案 1 :(得分:2)

以下是您如何概括到目前为止所做的工作:

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

答案 2 :(得分:1)

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

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函数检查所有向量是否具有1(或者除了0之外的任何向量)作为i元素。这会返回TrueFalse。我们可以使用1函数将其转换为0int