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

时间:2017-10-31 11:48:51

标签: python pass-by-reference mergesort

我有一个包含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 ”。

2 个答案:

答案 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);
        }
    }
}