[英]Python - Passing a list with elements, but I only get the first element in the list
我有一个包含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 ”。
在Python中,强烈建议使用内置函数。 我将文件转换为列表,然后使用lambda或将列表转换为键为ID的字典,然后使用sort()。
保持简单总是要付出的:
def main():
with open("input.csv") as f:
rows = [
tuple(int(x) for x in line.strip().split("\t"))
for line in f
if line.strip()
]
rows.sort()
with open("output.csv", "w") as f:
for row in rows:
f.write("{}\n".format("\t".join(str(x) for x in row)))
main()
$ cat input.csv
196 242 3 881250949
186 302 3 891717742
22 377 1 878887116
244 51 2 880606923
cat output.csv
22 377 1 878887116
186 302 3 891717742
196 242 3 881250949
244 51 2 880606923
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.