【问题标题】:python - Splitting a list of integers into list of digitspython - 将整数列表拆分为数字列表
【发布时间】:2018-04-04 21:37:44
【问题描述】:

我有一个包含 8 位整数的列表,其中每个整数代表一个标志。例如:

qc = [11221427, 23414732, 144443277,...]

我想创建 8 个新变量,其中第一个变量是所有数字的第一位,依此类推。例如:

qc1 = [1,2,1]
qc2 = [1,3,4]

我可以使用以下代码进行计算:

qc_str = [str(e) for e in qc]

k,l = 0,0

for item in qc_str:
    qc1[k] = int(qc_str[k][l])
    qc2[k] = int(qc_str[k][l+1])
    qc3[k] = int(qc_str[k][l+2])
    qc4[k] = int(qc_str[k][l+3])
    qc5[k] = int(qc_str[k][l+4])
    qc6[k] = int(qc_str[k][l+5])
    qc7[k] = int(qc_str[k][l+6])
    qc8[k] = int(qc_str[k][l+7])

    k += 1

在 100,000 行上运行需要很长时间。有没有更好或更快的方法来做到这一点。任何想法将不胜感激。

【问题讨论】:

    标签: python list


    【解决方案1】:

    这是一种方式:

    qc = [11221427, 23414732, 144443277]
    
    lst = [list(map(int, i)) for i in zip(*map(str, qc))]
    
    # [[1, 2, 1],
    #  [1, 3, 4],
    #  [2, 4, 4],
    #  [2, 1, 4],
    #  [1, 4, 4],
    #  [4, 7, 3],
    #  [2, 3, 2],
    #  [7, 2, 7]]
    

    如果您确实需要将它们作为单独的变量,请使用 lst[idx] 或字典 {i: j for i, j in enumerate(lst, 1)}

    【讨论】:

    • 哦,我喜欢 zip(*seq) 构造!
    【解决方案2】:

    如果更快意味着更短的处理时间,您应该注意 str() 和 int() 转换在计算上相当昂贵。

    您应该考虑使用整数除法和模数来提取单个数字:

    k-th digit (from the left) = number / 10^(k-1) % 10

    这里有一些我用来确认我的假设的快速脏代码。

    
    
        import time
    
        l = [x for x in range(1000000,9999999)]
        l2 = []
        l3 = []
    
        start = time.time()
        for x in l:
            a = str(x)
            l2.append(int(a[-2]))
    
        stop = time.time()
        print ("Elasped time: ", stop-start)
    
        start = time.time()
        for x in l:
            l3.append(x//10 % 10)
    
        stop = time.time()
    
        print("Elapsed time: ", stop-start)
    
    

    基本上,我比较了执行 str() 和 int() 以及使用整数除法提取数字以提取第二位数字之间的时间。

    我得到以下输出:

    13.855608940124512
    5.115100622177124
    

    这是 2.5 倍的性能提升。

    【讨论】:

      猜你喜欢
      • 2012-03-21
      • 1970-01-01
      • 2023-02-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-08
      • 2021-04-05
      • 1970-01-01
      相关资源
      最近更新 更多