Python:如何检查列表中每个子列表中的第一项是否是连续数字,第二个数字是否相同?

问题描述 投票:0回答:1

我是一名初学者因此无法解释这一点。我正在尝试创建条件语句以检查鼠标单击的位置。例如,我允许用户点击屏幕上的任意位置,这些点(x坐标,y坐标)被放入list。但是,我的列表将包含(x,y)元组,其中x和y的范围在0到8之间。

我正在尝试编写一个条件语句,其中对于相同的y坐标存在至少四个连续的x坐标。每次单击添加到列表后,它都会重新检查它。

代码需要能够检查元组中的所有x,并查找连续的数字,即使它们的顺序错误。

示例:List = [(1,2), (3,7), (4,2), (3,1), (5,2), (2,2), (3,2)]

在此示例中,连续5次鼠标单击,其中x = n + 1,y = 2,因此我的条件语句应将此标识为True。

我尝试了很多不同的东西,比如字典和单独的列表,但我真的不知道该怎么做。我目前试过这个:

# python
list2=[point[0] for point in List]
for n in list2:
   for column in range(0,8):
      if (List[n][column] and List[n+1][column] and List[n+2][column] and List[n+3][column])in List:
           self.__win= True
      else:
           self.__win=False
self.update()

List是用其他方法制作的,所以我试图获取每个子列表中的第一个点,将其放入list2,将其用作我的if语句的n,然后使用第二个for语句检查列。但是,它说索引超出范围,因为我第一次运行程序时,我的列表中没有任何内容,因为没有点击!

python-3.x nested-lists
1个回答
0
投票

由于您在连续流中添加点击次数,因此最好只跟踪最后一次点击和好连续的集合,直到条件匹配为止。

您可以使用函数静态变量通过装饰器附加到函数中,该函数估计您是否有4次正确的连续点击。

详细示例如下:

clicks = [(1,2), (3,7), (4,2), (3,1), (5,2), (2,2), (3,2)]
good_clicks = [(1,2), (2,2), (3,2), (4,2)]
good_not_first_clicks = [(3,4), (5,5), (1,2), (2,2), (3,2), (4,2), (7,8)]


def static_var(varname, value):
    def decorate(func):
        setattr(func, varname, value)
        return func
    return decorate


@static_var("consecutives", [])
@static_var("pre_click", None)
def add_click(click):
    if add_click.pre_click is None:
        add_click.pre_click = click
        add_click.consecutives.append(click)
        return False

    if add_click.pre_click[0] < click[0] and add_click.pre_click[1] == click[1]:
        add_click.consecutives.append(click)

        if len(add_click.consecutives) == 4:
            add_click.consecutives = [click]
            return True
        elif len(add_click.consecutives) > 4:
            add_click.consecutives = [click]
            return False
    else:
        add_click.consecutives = [click]

    add_click.pre_click = click

    return False


print("FIRST ATTEMPT")
for click in clicks:
    print(add_click.consecutives, add_click(click))

print("\nSECOND ATTEMPT")
for click in good_clicks:
    print(add_click.consecutives, add_click(click))

print("\nTHIRD ATTEMPT")
for click in good_not_first_clicks:
    print(add_click.consecutives, add_click(click))

哪个执行将产生:

FIRST ATTEMPT
[(1, 2)] False
[(1, 2)] False
[(3, 7)] False
[(4, 2)] False
[(3, 1)] False
[(5, 2)] False
[(2, 2), (3, 2)] False

SECOND ATTEMPT
[(2, 2), (3, 2)] False
[(1, 2), (2, 2)] False
[(1, 2), (2, 2), (3, 2)] False
[(1, 2), (2, 2), (3, 2), (4, 2)] True

THIRD ATTEMPT
[(4, 2)] False
[(3, 4)] False
[(5, 5)] False
[(1, 2), (2, 2)] False
[(1, 2), (2, 2), (3, 2)] False
[(1, 2), (2, 2), (3, 2), (4, 2)] True
[(4, 2)] False
© www.soinside.com 2019 - 2024. All rights reserved.