Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.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_Python 3.x_List - Fatal编程技术网

根据另一个列表高效地调整python列表

根据另一个列表高效地调整python列表,python,python-3.x,list,Python,Python 3.x,List,对不起,我想不出一个更好的题目来回答我的问题 我有两个相同长度的列表,例如 a = [True, False, False, True, True, False, False, True] b = [1, 2, 2, 1, 1, 3, 3, 2 ] i j i' j' 我想调整列表a的方式是,每当列表a中有一块或一个False从索引I到j时,它都会根据以下条件进行调整

对不起,我想不出一个更好的题目来回答我的问题

我有两个相同长度的列表,例如

a = [True, False, False, True, True, False, False, True]
b = [1,    2,     2,     1,    1,    3,     3,     2   ]
           i      j                  i'     j'
我想调整列表
a
的方式是,每当列表
a
中有一块或一个
False
从索引
I
j
时,它都会根据以下条件进行调整:

if b[i-1]==b[j+1]:
    a[i:j+1]=[True]*(j-i+1)
在上述示例中,有两个这样的块:
i,j=1,2
i',j'=5,6
。 结果应该是:

a = [True, True, True, True, True, False, False, True]
我使用
if
s编写了一个
for
循环的解决方案,但是速度太慢了,因为我想在非常大的列表上使用它

a = [True, False, False, True, True, False, False, True]
b = [1,    2,     2,     1,    1,    3,     3,     2   ]

#Edit: the next two lines were originally and wrongly inside the for loop
moving=True
istart=1
for i,trp in enumerate((a)):
    if trp==False:
        if moving==False:
            # if this condition holds, the particle just started a new move
            istart = i
            moving = True
    else:
        if moving==True:
            # is this condition holds, the particle has stopped its move
            moving = False
            if b[i]==b[istart-1]:
                # if this holds, a needs to be adjusted
                a[istart:i]=[True]*(i-istart)
任何帮助都将不胜感激。(注释和变量名称如下,因为它用于分析物理模拟)

您可以尝试以下方法:

import itertools
a = [True, False, False, True, True, False, False, True]
b = [1,    2,     2,     1,    1,    3,     3,     2   ]
new_a = [(a, list(b)) for a, b in itertools.groupby(zip(a, b), key=lambda x:x[0])]
final_list = list(itertools.chain(*[[True]*len(b) if not a and new_a[i-1][-1][-1] == new_a[i+1][-1][-1] and i > 0 else [c for c, d in b] for i, [a, b] in enumerate(new_a)]))
输出:

[True, True, True, True, True, False, False, True]
[True, True, True]
编辑:使用新输入进行测试:

a = [True, False, True]
b = [1, 3, 1]
new_a = [(a, list(b)) for a, b in itertools.groupby(zip(a, b), key=lambda x:x[0])]
final_list = list(itertools.chain(*[[True]*len(b) if not a and new_a[i-1][-1][-1] == new_a[i+1][-1][-1] and i > 0 else [c for c, d in b] for i, [a, b] in enumerate(new_a)]))
输出:

[True, True, True, True, True, False, False, True]
[True, True, True]
代码说明:


itertools.groupby
True
/
False
值的连续块形成单个列表。然后,
final\u list
存储对存储在
new\u a
中的列表进行迭代的结果,如果子列表完全由
False
值组成,则创建一个新的
True
值子列表,前提是且仅当前面和后面的值相同。这是通过使用
enumerate
为每次迭代收集当前索引来确定的。然后可以使用该索引通过
i-1
i+1
i+1

访问前面和后面的值。代码中没有任何东西会喊出“低效”。如果说“非常大”的列表,你是指数百万或数十亿的项目?如果是这样的话,您最好使用一个库(内置的或第三方的),它可以帮助您在C代码中完成这些工作,这会更快<代码>itertools
可能会起作用。2)用编译语言改写,如C、C++或java。纯Python天生比这些语言慢,编写一小段代码可能会解决您的问题。谢谢您的评论。我指的是非常大的10*8,但我想它真的不应该这么慢。。。我一定会查一查你说得对dantiston。这显然是jupyter笔记本的问题。我重新启动内核,再次运行函数,现在只需几秒钟。我将留下这个问题,因为Ajax1234已经回答了这个问题。谢谢你的回答。我测试了你的代码,但没有得到正确的结果。它似乎错过了模式
[True,False,True]
,而它应该变成
[True,True,True]
。顺便说一下,我在我的代码中发现了一个错误,我把它包括在question@Johann此答案假设“存在一块
False
”时,您指的是一次以上出现的
False
。在这种情况下,您的意思是只能有一个
False
?是的,我想这是一个糟糕的措辞,对不起。如果模式不正确,则还应替换
False
的单个实例applies@Johann没问题。请参阅我最近的编辑,因为我将您的新输入添加到了我的新解决方案中。@Johann我为不清楚而道歉。请看我最近的编辑。