Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 给定真/假的列表/数组,我们如何标记真的集群?_Python_List_Iteration - Fatal编程技术网

Python 给定真/假的列表/数组,我们如何标记真的集群?

Python 给定真/假的列表/数组,我们如何标记真的集群?,python,list,iteration,Python,List,Iteration,假设我们有一个仅为True或False的值列表。对True的每一组(即被False条目包围的True组)进行唯一标记的最佳方法是什么?(所有值False应转换为0) 在转换后的表格中,此列表将是: list1 = [1, 0, 0, 0, 0, 2, 2, 2, 0, 3, 3, 3, 3, 3, 0, 0, 4, 0, 0, 0, 0, 5, 5, 5, 0, 6, 6, 6, 6, 6, 0, 0] 我面临的挑战是,不需要for循环就可以快速完成这项任务。这里有一个itertools.gr

假设我们有一个仅为
True
False
的值列表。对
True
的每一组(即被
False
条目包围的
True
组)进行唯一标记的最佳方法是什么?(所有值
False
应转换为0)

在转换后的表格中,此列表将是:

list1 = [1, 0, 0, 0, 0, 2, 2, 2, 0, 3, 3, 3, 3, 3, 0, 0, 4, 0, 0, 0, 0, 5, 5, 5, 0, 6, 6, 6, 6, 6, 0, 0]

我面临的挑战是,不需要for循环就可以快速完成这项任务。

这里有一个itertools.groupby解决方案

b
# [False, True, True, False, True, True, False, True, True, False, True, False, False, False, False, True, True, True, True, False]

list(itertools.chain((k * j // 2 for j, (k, g) in enumerate(itertools.groupby(b), 2) for l in g)))
# [0, 1, 1, 0, 2, 2, 0, 3, 3, 0, 4, 0, 0, 0, 0, 5, 5, 5, 5, 0]
没有用于

sum(map(lambda jkg: [jkg[1][0] * jkg[0] // 2] * len(list(jkg[1][1])), enumerate(itertools.groupby(b), 2)), [])
# [0, 1, 1, 0, 2, 2, 0, 3, 3, 0, 4, 0, 0, 0, 0, 5, 5, 5, 5, 0]

# OP's example
sum(map(lambda jkg: [jkg[1][0] * jkg[0] // 2] * len(list(jkg[1][1])), enumerate(itertools.groupby(list1), 2)), [])
# [1, 0, 0, 0, 0, 2, 2, 2, 0, 3, 3, 3, 3, 3, 0, 0, 4, 0, 0, 0, 0, 5, 5, 5, 0, 6, 6, 6, 6, 6, 0, 0]

这是一个itertools.groupby解决方案

b
# [False, True, True, False, True, True, False, True, True, False, True, False, False, False, False, True, True, True, True, False]

list(itertools.chain((k * j // 2 for j, (k, g) in enumerate(itertools.groupby(b), 2) for l in g)))
# [0, 1, 1, 0, 2, 2, 0, 3, 3, 0, 4, 0, 0, 0, 0, 5, 5, 5, 5, 0]
没有用于

sum(map(lambda jkg: [jkg[1][0] * jkg[0] // 2] * len(list(jkg[1][1])), enumerate(itertools.groupby(b), 2)), [])
# [0, 1, 1, 0, 2, 2, 0, 3, 3, 0, 4, 0, 0, 0, 0, 5, 5, 5, 5, 0]

# OP's example
sum(map(lambda jkg: [jkg[1][0] * jkg[0] // 2] * len(list(jkg[1][1])), enumerate(itertools.groupby(list1), 2)), [])
# [1, 0, 0, 0, 0, 2, 2, 2, 0, 3, 3, 3, 3, 3, 0, 0, 4, 0, 0, 0, 0, 5, 5, 5, 0, 6, 6, 6, 6, 6, 0, 0]

基于另一个不带循环的列表创建一个全新的列表?基于另一个不带循环的列表创建一个全新的列表?我不知道,我在其中两次看到了
for
列表(itertools.chain(*map(lambda s:map(lambda x:x*s[0]//2,s[1][1]),枚举(itertools.groupby(b,2)))
所以我们可以假装没有循环?;-)@零比雷埃夫斯谢谢,我到达的或多或少是一样的。你的稍微优雅一点。嗯,事实上,这在我的例子中不起作用-(我不知道,我两次看到了
列表(itertools.chain(*map(lambda s:map)(lambda x:x*s[0]//2,s[1][1]),枚举(itertools.groupby(b,2)))
这样我们就可以假装没有循环了吗?;-)@ZeroPiraeus谢谢,我差不多也到了。你的稍微优雅一点。嗯,事实上,这在我的例子中不起作用-(