我必须解决这个练习:
你能实现函数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])
你可以帮我解决这个问题吗?感谢
答案 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
有关any
和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
元素。这会返回True
或False
。我们可以使用1
函数将其转换为0
或int
。