我目前正在基于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
干杯!
答案 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列表中。在循环结束时,我们更新前一个数字。