有没有一种方法可以确定列表的元素是否与另一个列表(具有相同索引)的元素匹配?

时间:2019-11-24 00:56:08

标签: python pandas numpy

我目前正在基于excel进行数据分析课程,但是我想完成有关Python的练习以提高我的熟练度。我有一张关于每天是否有积雪的excel数据表(1 =雪,0 =没有雪)。因此,我决定阅读此excel文件,并将每个数字附加到列表中,以使其更易于使用。尽管我似乎无法弄清楚下一步的操作。我需要从第一个元素开始遍历列表。如果元素= 1并且后续元素也= 1,则我希望此元素将'T'附加到新列表(在任何其他情况下为'F')。

示例: list = [1,1,0,1,0,1,1]

这将在新列表的第一个元素后面加上“ T”,因为前两个元素=1。第2个和第3个元素分别是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

干杯!

4 个答案:

答案 0 :(得分:2)

您可以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,则可以将测试更改为使用and而不是==。例如:

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的全零输入。

答案 1 :(得分:0)

您可以使用列表理解来做到这一点,如下所示:

["T" if l[i] == l[i+1] else "F" for i in range(len(l)-1)]
l = [1, 1, 0, 1, 0, 1, 1]
o = ["T" if l[i] == l[i+1] else "F" for i in range(len(l)-1)]

print(o) #> ['T', 'F', 'F', 'F', 'F', 'T']

答案 2 :(得分:0)

一行:

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

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

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

答案 3 :(得分:0)

以下是一个解决方案,它使用一次遍历您的列表。它可能不如采用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,用于存储“上一个”数字。遍历下一个数字后,我们将一个相应的字母附加到cover1列表中。在循环结束时,我们更新前一个数字。