list = [0, 1, 2, 3, 4, 1, 5, 0, 6, 5, 7, 8, 9, 10, 11, 12, 13, 2]


列表用于“矩阵之类”

1. 0 1 2
2. 3 4 1
3. 5 0 6


... 等等。我想将所有这些行写到一个新的列表/矩阵中,但是如果没有行,那将重复一个数字。但是,必须保留一行的顺序。

到目前为止,我使用这个:

compa = [0,1,2,3,4,1,5,0,6,5,7,8,9,10,11,12,13,2]   #the list to be used as base
temp = [0,1,2]      #new list starts from the first element
temp2 = [12,13,2]   #new list starts from the last element
Mischzahl = 3       #defines the number of elements in a line of the "matrix"
n = 0
while n < len(compa):
    for m in range(0,len(temp)):
        if temp[m] == compa[n]:
            n = (int(n/Mischzahl) + 1) * Mischzahl - 1 #calculates the "foul" line and sets n to the next line
            break
        if (n + 1) % Mischzahl == 0 and m == len(temp) - 1 : #if the end of temp is reached, the current line is transferred to temp.
            for p in range(Mischzahl):
                temp.append(compa[Mischzahl*int(n/Mischzahl) + p])
    n += 1


和同样的倒退

n = len(compa) - 1
while n > 0:    #same as above but starting from last element
    for m in range(len(temp2)):
        if temp2[m] == compa[n]:
            n = (int(n/Mischzahl) - 1) * Mischzahl + Mischzahl
            break
        if (n) % Mischzahl == 0 and m == len(temp2) - 1:
            for p in range(Mischzahl):
                temp2.append(compa[Mischzahl*int(n/Mischzahl) + p])
    n = n - 1


temp和temp2的结果输出:

[0, 1, 2, 3, 4, 1, 5, 0, 6, 5, 7, 8, 9, 10, 11, 12, 13, 2] #compa
[0, 1, 2, 5, 7, 8, 9, 10, 11]                              #temp
[12, 13, 2, 9, 10, 11, 5, 7, 8, 3, 4, 1]                   #temp2


由于这是脚本中最耗时的部分:有没有更有效的方法?任何有帮助的建议或方向都将受到欢迎。

最佳答案

您可以定义一个函数,该函数以给定长度的步幅在列表上进行迭代(在您的情况下为3),检查步幅的元素是否在一组数字中,如果没有扩展出列表并更新它。

from math import ceil

def unique_by_row(compa, stride_size=3, reverse=False):
    strides = ceil(len(compa)/stride_size)
    out = []
    check = set()
    it = range(strides)
    if reverse:
        it = reversed(it)
    for i in it:
        x = compa[stride_size*i:stride_size*(i+1)]
        if not check.intersection(x):
            out.extend(x)
            check.update(x)
    return out


测试:

compa = [0, 1, 2, 3, 4, 1, 5, 0, 6, 5, 7, 8, 9, 10, 11, 12, 13, 2]

unique_by_row(compa)
# returns:
[0, 1, 2, 5, 7, 8, 9, 10, 11]

unique_by_row(compa, reverse=True)
# returns:
[12, 13, 2, 9, 10, 11, 5, 7, 8, 3, 4, 1]

关于python - Python:如何有效地从矩阵中去除线条,其中的元素出现在其他线条中,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48491111/

10-12 16:49