Python:检查列表是否顺序

时间:2015-03-05 18:51:07

标签: python list hex iteration sequence

想要一个函数/语句,检查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

6 个答案:

答案 0 :(得分:6)

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开始编号的其余元素。我们得出结论,如果每个元素的编号与元素本身相同,我们就会有一个顺序列表。

答案 1 :(得分:4)

您可以使用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

答案 2 :(得分:3)

一个黑客做到了。这将查找列表中的总元素。正如您所提到的那样,它必须是顺序的,最后一个元素必须是列表的长度而不是第一个元素。

>>> 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

答案 3 :(得分: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']

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

答案 4 :(得分:0)

与@JuniorCompressor类似但使用列表理解, 你的基础构造将是:

bool_match_to_myList = [1 if int(i, 16) else 0 for i in mylist]

你可以很容易地检查是否真/假:

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]

答案 5 :(得分:0)

使用熊猫的“力量”的另一种选择:

def is_sequential(mylist):
    serie = pd.Series(mylist).apply(lambda x: int(x,16))
    return (serie.diff() > 1).sum() == 0
  • 在int系列中转换mylist变量
  • 使用diff()函数获取最后一个值与当前值之间的差值
  • 所有值之和大于1(我们想要的步骤),因此,如果sum()等于0,则所有值都是连续的
is_sequential(mylist1) # returns True
is_sequential(mylist2) # returns False