Python 有没有办法确定一个列表的一个元素是否与另一个列表(相同索引)的元素匹配?

Python 有没有办法确定一个列表的一个元素是否与另一个列表(相同索引)的元素匹配?,python,pandas,numpy,Python,Pandas,Numpy,我目前正在学习一门基于excel的数据分析课程,但我想完成Python的练习以提高我的熟练程度。我有一张excel表格,上面有每天是否有积雪的数据(1=雪,0=无雪)。因此,我决定阅读这个excel文件,并将每个数字添加到一个列表中,以便于处理。虽然我似乎不知道下一步该怎么做。我需要从第一个元素开始遍历列表;如果元素=1,后续元素也=1,我希望它将'T'附加到一个新列表中(在任何其他情况下为'F') 示例: 列表=[1,1,0,1,0,1,1] 这将在新列表中添加'T'作为第一个元素,因为前两个

我目前正在学习一门基于excel的数据分析课程,但我想完成Python的练习以提高我的熟练程度。我有一张excel表格,上面有每天是否有积雪的数据(1=雪,0=无雪)。因此,我决定阅读这个excel文件,并将每个数字添加到一个列表中,以便于处理。虽然我似乎不知道下一步该怎么做。我需要从第一个元素开始遍历列表;如果元素=1,后续元素也=1,我希望它将'T'附加到一个新列表中(在任何其他情况下为'F')

示例: 列表=[1,1,0,1,0,1,1]

这将在新列表中添加'T'作为第一个元素,因为前两个元素为=1。第二和第三个元素是1和0,因此应该在列表中添加“F”。这应该一直持续到最后。最后两个元素=1,因此应附加“T”

有人知道怎么做吗?这是我的尝试,但似乎每个案例都返回“F”:

def trans1(snow):
cover1 = []
snow1 = snow
snow2 = snow[1:]
for num1 in snow1:
    for num2 in snow2:
        if num1 == 1 and num2 ==1:
            trans01.append("T")
        else:
            trans01.append("F")
return cover1
干杯

您可以
zip()
将列表本身设置为偏移量,并在列表理解中与以下内容进行比较:

l = [1, 1, 0, 1, 0, 1, 1]

res = ['T' if a == b else 'F' for a, b in zip(l, l[1:])]
# res -> ['T', 'F', 'F', 'F', 'F', 'T']
如果您只对布尔值而不是字符串感兴趣,则更简单:

[a == b for a, b in zip(l, l[1:])]
# [True, False, False, False, False, True]
[根据评论进行编辑]

如果只想同时测试
1
s,可以将测试更改为使用
,而不是
=
。例如:

l = [0, 1, 1, 0, 0, 0] 
res = ['T' if a and b else 'F' for a, b in zip(l, l[1:])]
# res -> ['F', 'T', 'F', 'F', 'F']

将为所有零的输入提供所有
F
s

您可以通过以下列表理解来完成此操作:

[“T”如果l[i]==l[i+1]否则“F”表示范围内的i(len(l)-1)]
一行:

[“T”如果l[i]==l[i+1],则“F”表示范围内的i(len(l)-1)]

更长但更容易理解的方法:

ans = []
for i in range(len(l)-1):
    if l[i]==l[i+1]:
        ans.append("T")
    else:
        ans.append("F")

下面是一个解决方案,使用一次通过您的列表。它可能不如使用zip方法的单线解决方案优雅,但更容易理解:

def trans1(snow):
    cover1 = []
    num_prev=snow[0]
    for num_next in snow[1:]:
        if num_next+num_prev==2:
            cover1.append('T')
        else:
            cover1.append('F')
        num_prev=num_next

    return cover1

因此,它还有一个额外的变量
num_prev
,用于存储“previous”数字。在遍历后续编号后,我们在cover1列表中添加了一个相应的字母。在循环结束时,我们更新前面的数字

尝试合并索引和相关列,如果我理解正确,应该可以。您可以
zip
将原始列表和移位列表合并在一起,并检查每个元组中的循环(或列表理解),以获得所需的状态,以填充新列表。我实际上更喜欢此解决方案,但
zip
确实添加了更高级别的(imo)不必要的复杂性。好东西虽然+1。非常感谢,列表理解使它更容易!解决了我的问题:)对于连续的零,这与OP中指定的期望行为不匹配:“如果元素=1,后续元素也=1,我希望它将't'附加到一个新列表中(在任何其他情况下都是'F')。”然后,它又被接受为答案,所以可能我误解了。谢谢@NicholasM,我想你是对的。我添加了一个编辑。
def trans1(snow):
    cover1 = []
    num_prev=snow[0]
    for num_next in snow[1:]:
        if num_next+num_prev==2:
            cover1.append('T')
        else:
            cover1.append('F')
        num_prev=num_next

    return cover1