我有一个包含100000行的文件,其中包含以下方式的数据:
196 242 3 881250949
186 302 3 891717742
22 377 1 878887116
244 51 2 880606923
其中第一列代表ID。我想在ID上应用合并排序算法,所以我在C ++中使用geeksforgeeks的合并排序算法并将其转换为Python。
import sys
sys.setrecursionlimit(5000)
class Data:
id = 0
n1 = 0
rate = 0
n2 = 0
def main():
d = []
with open('data.txt', 'r') as f:
for line in f:
obj = Data()
obj.id, obj.n1, obj.rate, obj.n2 = map(int, line.split())
d.append(obj)
mergesort(d, 0, 100000-1)
printarray(d, 100000)
def mergesort(d, l, r):
if l < r:
m = int(l + int((r - l) / 2))
mergesort(d, l, m)
mergesort(d, m + 1, r)
merge(d, l, m, r)
def merge(d, l, m, r):
b1 = int(m - l + 1)
b2 = int(r - m)
left = []
right = []
for i in range(b1):
left.append(d[l + i])
for i in range(b2):
right.append(d[l + i])
i = 0
j = 0
k = l
while i < b1 and j < b2:
if left[i].id <= right[j].id:
d[k].id = left[i].id
d[k].n1 = left[i].n1
d[k].rate = left[i].rate
d[k].n2 = left[i].n2
i = i + 1
else:
d[k].id = right[j].id
d[k].n1 = right[j].n1
d[k].rate = right[j].rate
d[k].n2 = right[j].n2
j = j + 1
k = k + 1
while i < b1:
d[k].id = left[i].id
d[k].n1 = left[i].n1
d[k].rate = left[i].rate
d[k].n2 = left[i].n2
i = i + 1
k = k + 1
while j < b2:
d[k].id = right[j].id
d[k].n1 = right[j].n1
d[k].rate = right[j].rate
d[k].n2 = right[j].n2
j = j + 1
k = k + 1
def printarray(d, size):
with open('output.txt', 'w') as f:
for i in range(0, size):
f.write('%d\t%d\t%d\t%d\t\n' % (d[i].id, d[i].n1, d[i].rate, d[i].n2))
main()
问题是当我将对象列表“d”传递给mergesort函数时,并尝试打印列表的第一个和第二个元素,如下所示:
def mergesort(d, l, r):
print('%d\t%d\t%d\t%d\t\n' % (d[0].id, d[0].n1, d[0].rate, d[0].n2))
print('%d\t%d\t%d\t%d\t\n' % (d[1].id, d[1].n1, d[1].rate, d[1].n2))
if l < r:
m = int(l + int((r - l) / 2))
mergesort(d, l, m)
mergesort(d, m + 1, r)
merge(d, l, m, r)
打印:
196 242 3 881250949
196 242 3 881250949
然而,当我在我的主要功能中尝试相同时,它显示了正确的结果。 因此,当我将列表传递给其他函数时,它只包含第一个元素“ 196 242 3 881250949 ”。
答案 0 :(得分:0)
在Python中,我们建议使用内置函数。我将文件转换为列表,然后使用lambda或将列表转换为dict,其中键是ID,然后使用sort()。
答案 1 :(得分:0)
保持简单总是付出代价:
void replace(char *s1) {
char r[4][5] = { "get", "tell", "your", "house" };
char rep[4][10] = { "see", "us", "tall", "kite" };
char buff[500];
int i;
char *ch;
for (i < 0; i < 4; i++) {
if ((ch = strstr(s1, r[i]))) {
strncpy(buff, s1, ch - s1);
buff[ch-s1] = 0;
sprintf(buff + (ch - s1), "%s%s", rep[i], ch + strlen(r[i]));
s1[0] = 0;
strcpy(s1, buff);
return replace(s1);
}
}
}