Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/317.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_Performance - Fatal编程技术网

在python中使用列表进行查找和合并

在python中使用列表进行查找和合并,python,performance,Python,Performance,给定两个长度相同的列表,我要执行的操作是在第二个列表中查找,并将结果合并到原始列表中。但是,查找的键和值会发生更改 # Input data = ["A", "ReplaceMe", "ReplaceMe", "A", "ReplaceMe", "C"] replace_values = ["Version1", "", "&

给定两个长度相同的列表,我要执行的操作是在第二个列表中查找,并将结果合并到原始列表中。但是,查找的键和值会发生更改

# Input

data = ["A", "ReplaceMe", "ReplaceMe", "A", "ReplaceMe", "C"]
replace_values = ["Version1", "", "", "Version2", "", ""]


# Expected output
['A', 'Version1', 'Version1', 'A', 'Version2', 'C']


def replace_elements(dataset, replacements):
    for j, i in enumerate(dataset):
        if i == "A":
            replace_by = replacements[j]
        if i == "ReplaceMe":
            dataset[j] = replace_by
    return dataset

我当前的实现完成了任务,但具有O(n)复杂性。我可以使用
dict
以更快的方式完成这项工作吗?

这将使用
熊猫
完成这项工作。它对
replace_值
进行正向填充,然后用
replace_值
中同一行的值替换ReplaceMe。其中:

import pandas as pd

data = ["A", "ReplaceMe", "ReplaceMe", "A", "ReplaceMe", "C"]
replace_values = ["Version1", "", "", "Version2", "", ""]

df = pd.DataFrame(zip(data,replace_values), columns=['data', 'replace_values']).replace('', None).ffill()
df['data'] = np.where(df['data'] == 'ReplaceMe', df['replace_values'], df['data'])
df['data'].tolist()
输出:

['A', 'Version1', 'Version1', 'A', 'Version2', 'C']

不,您不能超越O(n)实现,尽管使用数据结构进行查找,但无论如何,您必须对输入中的数据进行一次扫描

这是一个单行程序版本,使用walrus操作符,但我不认为这会更快:

[current if dt=='ReplaceMe' else  dt for (dt,rp) in zip(data,replace_values) if (current := (rp if dt=='A' else current))]

非常感谢您在解决方案中加入
pandas