如何从 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]
}
我有一个数组,其中包含 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]
}