二进制数列表:有多少个位置有一个和一个零
List of binary numbers: How many positions have a one and zero
我有一个整数列表,例如i=[1,7,3,1,5]
我首先将其转换为长度为 L
的相应二进制表示的列表,例如b=["001","111","011","001","101"]
与 L=3
.
现在我想计算在二进制表示中有多少个 L
位置有一个 1
以及一个零 0
。在我的示例中,结果将是 return=2
,因为在这些条目的第三个(最后一个)位置总是有一个 1
。我很乐意发表任何评论。我认为,理想情况下我应该同时进行许多 Xor 运算。但是,我不确定如何才能有效地做到这一点。
编辑:感谢您的众多回答!!我得看看哪个最快。
您可以使用 python 个按位运算符来完成此任务。
def find(aList, nn):
return sum(
filter(
lambda bb: bb > 0 ,
(
( 1 <= (sum( (aa & 1<<kk) > 0 for aa in aList)) < len(aList) )
for kk in range(nn)
)
)
)
>>> find([1,7,3,1,5],3)
2
>>> find([],3)
0
>>> find([7],3)
0
>>> find([7,1],3)
2
>>> find([7,1,7],3)
2
这是一个解决方案,我怀疑它不是很有效,但很容易理解。
我遍历数字并找到唯一集,然后计算集长度为二的条目数:
# create a binary list of 3 elements from input list of integers
i=[1,7,3,1,5]
b=['{0:03b}'.format(x) for x in i]
# loop over the digit position (1,2,3)
cnt=[]
for pos in range(3):
cnt.append(len(set([c[pos] for c in b])))
# cnt now contains a list of either 2(=both 1 and 0 present) or 1 (unique)
# so now we count the number of entries with "2"
result=cnt.count(2)
print (result)
答案:
2
首先,你的问题用 numpy 标记,但你的数组不是 numpy 数组。
这是一个使用 numpy 的解决方案:
import numpy as np
def has_zeroes_and_ones_at_index(arr, index_from_right):
shifted_arr = np.right_shift(arr, index_from_right)
has_one_at_index = shifted_arr % 2 == 1
return(True in has_one_at_index and False in has_one_at_index)
arr = np.array([1, 7, 3, 1, 5])
res= has_zeroes_and_ones_at_index(arr, 1)
print(res)
因为数字是以二进制存储的,所以我们可以使用位移位将数字的所有位向右移动,然后查看最后一位。我们之前不必将它们转换为二进制格式。
5 (101) 右移一位 -> 2 (010)
然后我们创建一个掩码以查看哪些数字的最后一位为 1,return 当掩码中至少有一个真元素和一个假元素时为真。
一个观察结果是,如果您对所有数字进行 AND 运算,并对所有数字进行 OR 运算,那么这两个结果的 XOR 将为满足条件的 1。
所以:
from functools import reduce
from operator import and_, or_
def count_mixed_bits(lst):
xor = reduce(and_, lst) ^ reduce(or_, lst)
return bin(xor).count("1")
count_mixed_bits([1,7,3,1,5]) # 2
取而代之的是 numpy.binary_repr
method that accepts length. Unfortunately, it can't handle arrays. But you can apply a functionality of np.unravel_index
:
def check(arr, lenght):
positions = np.array(np.unravel_index(i, (2,)*lenght))
return positions, np.sum(np.sum(positions, axis=1) != len(arr))
>>> positions, output = check(i, 3)
>>> print(positions)
>>> print(output)
[[0 1 0 0 1]
[0 1 1 0 0]
[1 1 1 1 1]]
2
我有一个整数列表,例如i=[1,7,3,1,5]
我首先将其转换为长度为 L
的相应二进制表示的列表,例如b=["001","111","011","001","101"]
与 L=3
.
现在我想计算在二进制表示中有多少个 L
位置有一个 1
以及一个零 0
。在我的示例中,结果将是 return=2
,因为在这些条目的第三个(最后一个)位置总是有一个 1
。我很乐意发表任何评论。我认为,理想情况下我应该同时进行许多 Xor 运算。但是,我不确定如何才能有效地做到这一点。
编辑:感谢您的众多回答!!我得看看哪个最快。
您可以使用 python 个按位运算符来完成此任务。
def find(aList, nn):
return sum(
filter(
lambda bb: bb > 0 ,
(
( 1 <= (sum( (aa & 1<<kk) > 0 for aa in aList)) < len(aList) )
for kk in range(nn)
)
)
)
>>> find([1,7,3,1,5],3)
2
>>> find([],3)
0
>>> find([7],3)
0
>>> find([7,1],3)
2
>>> find([7,1,7],3)
2
这是一个解决方案,我怀疑它不是很有效,但很容易理解。
我遍历数字并找到唯一集,然后计算集长度为二的条目数:
# create a binary list of 3 elements from input list of integers
i=[1,7,3,1,5]
b=['{0:03b}'.format(x) for x in i]
# loop over the digit position (1,2,3)
cnt=[]
for pos in range(3):
cnt.append(len(set([c[pos] for c in b])))
# cnt now contains a list of either 2(=both 1 and 0 present) or 1 (unique)
# so now we count the number of entries with "2"
result=cnt.count(2)
print (result)
答案:
2
首先,你的问题用 numpy 标记,但你的数组不是 numpy 数组。 这是一个使用 numpy 的解决方案:
import numpy as np
def has_zeroes_and_ones_at_index(arr, index_from_right):
shifted_arr = np.right_shift(arr, index_from_right)
has_one_at_index = shifted_arr % 2 == 1
return(True in has_one_at_index and False in has_one_at_index)
arr = np.array([1, 7, 3, 1, 5])
res= has_zeroes_and_ones_at_index(arr, 1)
print(res)
因为数字是以二进制存储的,所以我们可以使用位移位将数字的所有位向右移动,然后查看最后一位。我们之前不必将它们转换为二进制格式。 5 (101) 右移一位 -> 2 (010)
然后我们创建一个掩码以查看哪些数字的最后一位为 1,return 当掩码中至少有一个真元素和一个假元素时为真。
一个观察结果是,如果您对所有数字进行 AND 运算,并对所有数字进行 OR 运算,那么这两个结果的 XOR 将为满足条件的 1。
所以:
from functools import reduce
from operator import and_, or_
def count_mixed_bits(lst):
xor = reduce(and_, lst) ^ reduce(or_, lst)
return bin(xor).count("1")
count_mixed_bits([1,7,3,1,5]) # 2
取而代之的是 numpy.binary_repr
method that accepts length. Unfortunately, it can't handle arrays. But you can apply a functionality of np.unravel_index
:
def check(arr, lenght):
positions = np.array(np.unravel_index(i, (2,)*lenght))
return positions, np.sum(np.sum(positions, axis=1) != len(arr))
>>> positions, output = check(i, 3)
>>> print(positions)
>>> print(output)
[[0 1 0 0 1]
[0 1 1 0 0]
[1 1 1 1 1]]
2