我有一个输入列表data
,如下所示,我想根据字母顺序将其制表,将每个值定位在每行的正确列中。下面的代码可以工作,但是当我有一个大的输入列表(一个data
列表有超过10K的子列表,letters
列表有大约12个元素)时,我得到MemoryError
import pandas as pd
letters = ['A','B','C']
data = [['C', 3], ['B', 5], ['A', 1], ['B', 4], ['C', 2], ['A', 3], ['C', 8], ['A',9],['B',5]]
out = []
while data:
out.append([
data.pop(0)[1] if data and data[0][0] == h else None
for h in letters
])
df = pd.DataFrame(out, columns=letters)
输出:
每行都是从data
的每个子列表的元素[0][1]
构建的。如果找到序列['A','x'], ['B','y'], ['C','z']
,则该行将是['x','y','z']
。如果子列表是['B','y']
或['C','z']
,那么该行的其他值应该是None
。就像输入的data
列表是这样的。
list2 = [
['A', ''], ['B', ''], ['C', 3 ],
['A', ''], ['B', 5 ], ['C', ''],
['A', 1 ], ['B', 4 ], ['C', 2 ],
['A', 3 ], ['B', ''], ['C', 8 ],
['A', 9 ], ['B', 5 ], ['C', '']
]
为了避免MemoryError
,我尝试创建3个这样的循环,但由于最初我不知道有多少行会有output
列表,以便在2或3个循环中分离,以创建3个输出列表。我希望能说得通。谢谢你的帮助
a = []
b = []
c = []
n = len(data)//3
if data:
for k in range(n):
a.append([
data.pop(0)[1] if data[0][0] == h else None
for h in letters
])
1条答案
按热度按时间4uqofj5v1#
您的代码在
MemoryError
上失败,因为您在循环中弹出列表的第一个元素,不断向左移动所有元素以填充开头差距。下面是一个不使用pop方法的算法的可能实现,它应该运行得更快,并且没有内存开销: