问题 检查序列的列表


我想检查列表是否具有特定的元素序列。我已经对包含7个元素的列表进行了排序,我现在要检查前4个是否相同,最后3个是相同的。

对于我想要实现的是True,列表将是这样的:

list = ['1','1','1','1','2','2','2'] 

我希望这能使我想要达到的目标更加清晰。


5593
2017-12-06 13:18


起源

if len(set(lst[:3])) == 1 and len(set(lst[3:])) == 1: - Hugh Bothwell
可能重复 stackoverflow.com/questions/3787908/... - SIslam
可能重复 如何在Python中将列表拆分为大小均匀的块? - Vaibhav Mule


答案:


您可以切片列表。采取前四个要素:

>>> L = ['1','1','1','1','2','2','2'] 
>>> L[:4]
['1', '1', '1', '1']

和最后三个:

>>> L[-3:]
['2', '2', '2']

一个  不允许重复。因此:

 >>> set(L[:4])
 {1}

这意味着如果此组的长度为1,则切片列表中的所有元素都相同。

把这一切放在一起:

>>> len(set(L[:4])) == 1 and len(set(L[-3:])) == 1
True

向您显示您的状况得到满足。


8
2017-12-06 14:03



正好是@Hugh Bothwell在问题中评论的内容。 - SIslam


这应该工作,只需将每个子列表传递给函数:

def all_same(items):
    return all(x == items[0] for x in items)

以上内容来自以下帖子: Python:确定列表中的所有项目是否都是同一项目


3
2017-12-06 13:49





如果要检查列表是否包含一个元素的3个项目和另一个元素的4个项目,则可以使用省略排序 collections.Counter

content = Counter(['1', '2', '2', '1', '1', '2', '1']).most_common()
print(content) # => [('1', 4), ('2', 3)]

if len(content) == 2 and content[0][1] == 4 and content[1][1] == 3 or
   len(content) == 1 and content[0][1] == 7:
    pass # Your list have desired structure

2
2017-12-06 14:56





根据问题的额外细节,这可以解决问题:

def check_group_equal(inputList):
    ref = inputList[0]
    for e in inputList[1:]:
        if e != ref:
            return False
    return True

list = some_random_list(length=7)

# Check first group
check_group_equal(list[0:3])

# Check second group
check_group_equal(list[4:7])

1
2017-12-06 13:35



最后一个值有很大帮助,所以非常感谢!但是我不认为这个表达会实现我想要的。我编辑了帖子,试图解释我想要更好地检查的内容。 - Frazer224
这永远不会是真的,3长度列表总是与2长度列表不同 - Netwave
亲爱的downvoter,请注意我的第一个答案的版本是针对第一个问题的版本。在编辑中看到额外信息后,我 因此调整了我的答案。请重新考虑你做了什么 - SebasSBM


如果您可以将列表转换为字符串, re 会做:

re.match(r'^(.)\1{3}(.)\2{2}$', ''.join(['1','1','1','1','2','2','2']))

1
2017-12-06 14:40