检查十六进制值列表是否连续
Check whether a list of hexadecimal values is sequential or not
想要一个函数/语句,检查mylist
的所有值是否是连续的,即十六进制列表。
例如:
def checkmylist(mylist):
#code returns True or False
mylist1 = ['03', '04', '05', '06', '07', '08', '09', '0a', '0b', '0c','0d', '0e', '0f']
mylist2 = ['03', '05', '06', '07', '08', '09', '0a', '0b', '0c','0d', '0e', '0f']
checkmylist(mylist1)
#expected to returns pass
checkmylist(mylist2)
#expected to returns fail
一个技巧就是。这将找到列表中的全部元素。正如您提到的,它必须是连续的,最后一个元素的长度必须大于第一个元素。
>>> def checkmylist(l):
... a = [int(i,16) for i in sorted(set(l))]
... return (len(a) == (a[-1]-a[0]+1))
...
>>> checkmylist(mylist1)
True
>>> checkmylist(mylist2)
False
>>> checkmylist(['2', '2', '4'])
False
mylist1 = ['03', '04', '05', '06', '07', '08', '09', '0a', '0b', '0c','0d', '0e', '0f']
mylist2 = ['03', '05', '06', '07', '08', '09', '0a', '0b', '0c','0d', '0e', '0f']
def checkmylist(li):
start=int(li[0],16)
for e in li[1:]:
a=int(e,16)
if a==start+1:
start=a
else:
return False
return True
assert checkmylist(mylist1)==True
#expected to returns pass
assert checkmylist(mylist2)==False
#expected to returns fail
def checkmylist(mylist):
it = (int(x, 16) for x in mylist)
first = next(it)
return all(a == b for a, b in enumerate(it, first + 1))
在第一条语句中,我们将十六进制数转换为整数生成器。使用 next(it)
我们获取生成器的第一个元素。然后我们枚举从first + 1
开始编号的其余元素。如果每个元素的编号与元素本身相同,我们得出结论,我们有一个顺序列表。
您可以使用 iter
创建列表的迭代器(从第二个索引到末尾),然后使用 all
函数检查您是否有序列,请注意 int(next(it),16)
(或者作为评论中提到的更有效的方式使用 functools.partial(int, base=16)
)会将您的字符串转换为以 16 为底的整数,然后您可以对它们进行操作:
>>> import functools
>>> int16 = functools.partial(int, base=16)
>>> def checker(li):
... it=iter(li[1:])
... return all(int16(next(it))-int16(i)==1 for i in li[:-1])
演示:
mylist1 = ['03', '04', '05', '06', '07', '08', '09', '0a', '0b', '0c','0d', '0e', '0f']
mylist2 = ['03', '05', '06', '07', '08', '09', '0a', '0b', '0c','0d', '0e', '0f']
>>> checker(mylist1)
True
>>> checker(mylist2)
False
与@JuniorCompressor 类似,但使用列表理解,
你的基本结构是:
bool_match_to_myList = [1 if int(i, 16) else 0 for i in mylist]
您可以检查一下是否 true/false 足够简单:
myList_is_sequential = sum([1 if int(i, 16) else 0 for i in mylist]) < 1
或者你可以在 numpy
的帮助下找到它关闭的索引(不是顺序的)
import numpy as np
bool_match_to_myList_np = np.array([1 if int(i, 16) else 0 for i in mylist])
np.where(bool_match_to_myList == 0)[0]
另一种选择,使用 Pandas 的 "power":
def is_sequential(mylist):
serie = pd.Series(mylist).apply(lambda x: int(x,16))
return (serie.diff() > 1).sum() == 0
- 将 mylist 变量转换为 int 系列
- 使用 diff() 函数,获取上一个值和当前值之间的差异
- 对大于 1 的所有值求和(我们想要的步骤),因此如果 sum() 等于 0,则所有值都是连续的
is_sequential(mylist1) # returns True
is_sequential(mylist2) # returns False
想要一个函数/语句,检查mylist
的所有值是否是连续的,即十六进制列表。
例如:
def checkmylist(mylist):
#code returns True or False
mylist1 = ['03', '04', '05', '06', '07', '08', '09', '0a', '0b', '0c','0d', '0e', '0f']
mylist2 = ['03', '05', '06', '07', '08', '09', '0a', '0b', '0c','0d', '0e', '0f']
checkmylist(mylist1)
#expected to returns pass
checkmylist(mylist2)
#expected to returns fail
一个技巧就是。这将找到列表中的全部元素。正如您提到的,它必须是连续的,最后一个元素的长度必须大于第一个元素。
>>> def checkmylist(l):
... a = [int(i,16) for i in sorted(set(l))]
... return (len(a) == (a[-1]-a[0]+1))
...
>>> checkmylist(mylist1)
True
>>> checkmylist(mylist2)
False
>>> checkmylist(['2', '2', '4'])
False
mylist1 = ['03', '04', '05', '06', '07', '08', '09', '0a', '0b', '0c','0d', '0e', '0f']
mylist2 = ['03', '05', '06', '07', '08', '09', '0a', '0b', '0c','0d', '0e', '0f']
def checkmylist(li):
start=int(li[0],16)
for e in li[1:]:
a=int(e,16)
if a==start+1:
start=a
else:
return False
return True
assert checkmylist(mylist1)==True
#expected to returns pass
assert checkmylist(mylist2)==False
#expected to returns fail
def checkmylist(mylist):
it = (int(x, 16) for x in mylist)
first = next(it)
return all(a == b for a, b in enumerate(it, first + 1))
在第一条语句中,我们将十六进制数转换为整数生成器。使用 next(it)
我们获取生成器的第一个元素。然后我们枚举从first + 1
开始编号的其余元素。如果每个元素的编号与元素本身相同,我们得出结论,我们有一个顺序列表。
您可以使用 iter
创建列表的迭代器(从第二个索引到末尾),然后使用 all
函数检查您是否有序列,请注意 int(next(it),16)
(或者作为评论中提到的更有效的方式使用 functools.partial(int, base=16)
)会将您的字符串转换为以 16 为底的整数,然后您可以对它们进行操作:
>>> import functools
>>> int16 = functools.partial(int, base=16)
>>> def checker(li):
... it=iter(li[1:])
... return all(int16(next(it))-int16(i)==1 for i in li[:-1])
演示:
mylist1 = ['03', '04', '05', '06', '07', '08', '09', '0a', '0b', '0c','0d', '0e', '0f']
mylist2 = ['03', '05', '06', '07', '08', '09', '0a', '0b', '0c','0d', '0e', '0f']
>>> checker(mylist1)
True
>>> checker(mylist2)
False
与@JuniorCompressor 类似,但使用列表理解, 你的基本结构是:
bool_match_to_myList = [1 if int(i, 16) else 0 for i in mylist]
您可以检查一下是否 true/false 足够简单:
myList_is_sequential = sum([1 if int(i, 16) else 0 for i in mylist]) < 1
或者你可以在 numpy
的帮助下找到它关闭的索引(不是顺序的)import numpy as np
bool_match_to_myList_np = np.array([1 if int(i, 16) else 0 for i in mylist])
np.where(bool_match_to_myList == 0)[0]
另一种选择,使用 Pandas 的 "power":
def is_sequential(mylist):
serie = pd.Series(mylist).apply(lambda x: int(x,16))
return (serie.diff() > 1).sum() == 0
- 将 mylist 变量转换为 int 系列
- 使用 diff() 函数,获取上一个值和当前值之间的差异
- 对大于 1 的所有值求和(我们想要的步骤),因此如果 sum() 等于 0,则所有值都是连续的
is_sequential(mylist1) # returns True
is_sequential(mylist2) # returns False