如何从 Python 中包含多个字符串的数组中获取中值字符串值?

How to get Median string value from array with multiple strings in Python?

我有一个数组,其中包含 1 和 0 等值。 像这样:

['00100','00101','00101','01100','01001','00101']

我想得到数组每个字符串中每个字符的中值:

return 会是这样的:

'00101'

如果你能在Python中举出例子就太好了。

Python 对这类问题有自然的习语。这个想法是将所有第 0 个字符,所有第 1 个字符,所有第 2 个字符,...等(zip(*a) 部分)分成易于消化的块;然后找出每个块的中位数( sorted(d)[len(a)/2] 部分);然后再次将这些块重新组合在一起。这给了我们 one-liner:

def findMedians(a):
    return ''.join(sorted(d)[len(a)/2] for d in zip(*a))

print findMedians(['00100','00101','00101','01100','01001','00101'])
# 00101
print findMedians(['1210', '2501', '1234'])
# 1211

如果您觉得这有点令人困惑,请尝试:

print zip('123','456','789')
a = ['123','456','789']
print zip(*a)

查看“*”运算符在这里做什么。

所以你有二维数组

array = {['1210'], ['2501'], ['1234']} // [3][4] array

我将创建新的二维数组,用于存储包含原始数组的每个字符串中的第 0 个字符的字符串,第 1 个字符,第 2 个字符,...

tempArray[4][3]

i = 0;
for(i = 0; i < 4; i = i + 1) 
{
    for(int j = 0; j < 3; j = j + 1){
        tempArray[i][j] = array[j][i]
    }
    // when outer cycle finishes collecting nth chars
    // you need to sort it from smallest to largest digit
    sortAscending(tempArray[i])
}

结果数组看起来像这样

// chars of   0th,      1st,     2nd,     3th    elements
tempArray = {['112'], ['225'], ['013'], ['014']}  

最后,您将中间字符收集到新字符串

stringOfMedians[4];
for(i = 0; i < 4; i = i + 1){
    // Take middle element from each string and put it in final string.
    stringOfMedians[i] = tempArray[i][strlen(tempArray[i])/2]
}

最终结果

stringOfMedians = '1211'

再多说一句。您应该添加

stringOfMedians[i] = tempArray[i][strlen(tempArray[i])/2]

到我展示的第一个代码块的外循环以进行优化。它不必有自己的循环。 最终结果:

array = {['1210'], ['2501'], ['1234']} // [3][4] array

tempArray[4][3]; 

i = 0;
for(i = 0; i < 4; i = i + 1) 
{
    for(int j = 0; j < 3; j = j + 1){
        tempArray[i][j] = array[j][i]
    }
    // when outer cycle finishes collecting nth chars
    // you need to sort it from smallest to largest digit
    sortAscending(tempArray[i]);

    // Take middle element from string and put it in final string.
    stringOfMedians[i] = tempArray[i][strlen(tempArray[i])/2]
}