繁体   English   中英

Python-传递带有元素的列表,但是我只获得列表中的第一个元素

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM