我有一个清单
truthList = [True,False,False,False,True,False,True,True]
我想“和”此列表中的两个后续索引。
output[0]=truthList[0] and truthList[1]
output[1]=truthList[2] and truthList[3]
....
“安定”以上列表将给出以下输出
output = [False,False,False,True]
有两种情况
1列表只有偶数个索引
2列表可以有偶数或奇数个索引
有人可以为这两种情况建议一个简单的快捷方式(最好通过列表理解或地图)
答案 0 :(得分:2)
对于偶数和奇数长度列表,您可以将itertools.izip_longest()
与 list comprehesnion 表达式一起使用:
>>> from itertools import izip_longest
>>> truthList = [True,False,False,False,True,False,True,True, False]
# jumping the list by 2 v
>>> [i and j for i, j in izip_longest(truthList[::2], truthList[1::2], fillvalue=False)]
# Does `and` with `False` as pair up for last entry in case of `odd` list ^
[False, False, False, True, False]
在这里,您需要根据您需要的行为将fillvalue
参数的值设置为True
/ False
。正如document所说:
如果迭代的长度不均匀,则使用
fillvalue
填充缺失值。
对于奇数长度列表,如果要保持列表的最后一个值,则必须将fillvalue
设置为truthList[-1]
。
对于甚至列表,zip
符合以下要求:
>>> truthList = [True,False,False,False,True,False,True,True]
>>> [i and j for i, j in zip(truthList[::2], truthList[1::2])]
[False, False, False, True]
答案 1 :(得分:2)
如果我们有一个奇数个元素,那么接近这个的一种蛮力方法就是将最后一个项目追加到列表的末尾。这样我们得到l[n - 1] and l[n - 1]
输出列表中的最后一个元素:
l = [True, False, False, False, True, False, True, True]
if len(l) % 2 == 1:
l.append(l[-1])
l_sort = [ l[i] and l[i + 1] for i in range(0, len(l), 2)]
print(l_sort)
答案 2 :(得分:1)
您可以将map()
与operator.and_()
一起使用,如下所示:
import operator
map(operator.and_, truthList[::2], truthList[1::2])
如果你的列表长度是一个奇数,你可以这样做:
result = map(operator.and_, truthList[:-1:2], truthList[1:-1:2])
然后,如果您想为最后一个值添加False
:
result.append(False)
完整的代码是:
def my_and(my_list):
if len(my_list) % 2:
result = map(operator.and_, my_list[:-1:2], my_list[1:-1:2])
result.append(False)
return result
return map(operator.and_, my_list[::2], my_list[1::2])
<强>输出:强>
>>> truth_list1 = [True,False,False,False,True,False,True,True]
>>> my_and(truth_list1)
[False, False, False, True]
>>>
>>> truth_list2 = [True,False,False,False,True,False,True,True,True]
>>> my_and(truth_list2)
[False, False, False, True, False]