将字符串转换为二维列表

2024-09-28 16:21:58 发布

您现在位置:Python中文网/ 问答频道 /正文

def convert_to_list(VertexList):
    VerticesList = []
    items = VertexList.split(';')
    for item in items:
        i = item.split(',')
        SubList = []
        for item in i:
            SubList.append(item)
        VerticesList.append(SubList)
    return VerticesList

此代码将此格式的字符串转换为二维列表。然而,我相信它是可以优化的

Input -> '1,2,4,5,6,7;2,3,4,5,6,7,8;1,2,4,5,6,8'
Output -> [['1', '2', '4', '5', '6', '7'], ['2', '3', '4', '5', '6', '7', '8'], ['1', '2', '4', '5', '6', '8']]

Tags: to代码inconvertforreturndefitems
2条回答

这不是一个解决方案,而只是上述代码在实际性能方面的最佳性比较:

from timeit import Timer

code1 = """\
def convert_to_list(VertexList):
    VerticesList = []
    items = VertexList.split(';')
    for item in items:
        i = item.split(',')
        SubList = []
        for item in i:
            SubList.append(item)
        VerticesList.append(SubList)
    return VerticesList
inp = '1,2,4,5,6,7;2,3,4,5,6,7,8;1,2,4,5,6,8'
convert_to_list(inp)
"""

code2 = """\
inp = '1,2,4,5,6,7;2,3,4,5,6,7,8;1,2,4,5,6,8'
out = [s.split(',') for s in inp.split(';')]
"""

t = Timer(stmt=code1)
time1 = t.timeit()  # 1000000 iteration by default
print(f"Original time:{round(time1, 6)} sec.")

t = Timer(stmt=code2)
time2 = t.timeit()  # 1000000 iteration by default
print(f"New time: {round(time2, 6)} sec.")

print(f'New solution faster in = {round(time1 / time2, 1)} times')

输出:

Original time:1.812856 sec.
New time: 0.741987 sec.
New solution faster in = 2.4 times

运用理解力

inp = '1,2,4,5,6,7;2,3,4,5,6,7,8;1,2,4,5,6,8'

print([s.split(',') for s in inp.split(';')])

导致

[['1', '2', '4', '5', '6', '7'], ['2', '3', '4', '5', '6', '7', '8'], ['1', '2', '4', '5', '6', '8']]

这是更小、更容易阅读的代码,这是我希望您寻找的优化的一部分。它不会减少循环次数,但它执行的赋值更少,使用的临时变量更少,函数调用更少(即append())。也许这些调用中的一些是在理解中的幕后进行的,但是您应该利用Python对其理解所做的任何优化,即调用什么函数

更新

查看this answer了解OP的性能分析和这个答案

更新2

要将所有字符串转换为int,可以使用map或其他理解

inp = '1,2,4,5,6,7;2,3,4,5,6,7,8;1,2,4,5,6,8'

print([list(map(int, s.split(','))) for s in inp.split(';')])

inp = '1,2,4,5,6,7;2,3,4,5,6,7,8;1,2,4,5,6,8'

print([[int(c) for c in s.split(',')] for s in inp.split(';')])

相关问题 更多 >