将一个d列表转换为2d列表(写入错误)

2024-10-01 07:50:59 发布

您现在位置:Python中文网/ 问答频道 /正文

所以我做输入/输出,我试着让我的程序逻辑下来,因为给定的名字和课程,我会把名字按字母顺序写进文件,然后是他们所学的课程。我完成了这一点,并把所有的东西都写进了一张单子里。现在我正试图连接到一个文本文件"name, class, .....(if more than one class)" 但由于我已经把它编入了1d列表,所以程序逐项编写,而不是将名称和类放在一起。例如,我想把新文件读出来

Ashley,MATH 1426,PHYS 1443
Jonathan,IE 3312
Joseph,IE 3312
Nang,MATH 1426
Ram,IE 3312
Randal,IE 3301,MATH 2325,PHYS 1443
Sol,IE 3301

如果我有一个单d列表怎么办。我在想写些

while name, remains the same, write the classes, when name changes print newline....., write name and classes

问题是这是一个名单,我不知道如何检测名称的变化。是否有必要将其转换为一个包含一个名称及其类的子列表?这是我原始的二维列表,没有缩写

[['Adam', 'PHYS 1443'], ['Ashley', 'IE 3312'], ['Ashley', 'PHYS 1443'], ['August', 'PHYS 1444'], ['Baron', 'PHYS 1443'], ['Christopher', 'IE 3301'], ['Christopher', 'CSE 1320'], ['Christopher', 'PHYS 1443'], ['Dylan', 'CSE 1310'], ['Henry', 'PHYS 1444'], ['James', 'IE 3301'], ['James', 'PHYS 1443'], ['Jonathan', 'IE 3312'], ['Krishna', 'CSE 1310'], ['Luis', 'CSE 1310'], ['Michael', 'IE 3301'], ['Nang', 'PHYS 1443'], ['Pramod', 'PHYS 1444'], ['Pramod', 'PHYS 1443'], ['Saroj', 'IE 3301'], ['Saroj', 'MATH 1426'], ['Sol', 'CSE 1310'], ['Timothy', 'MATH 2325'], ['Timothy', 'IE 3301']]

为了组织化,我编写了以下代码,将其添加到一个列表中,这是一个错误

d = []
size = len(c)
two = []
d.append(c[0][0])
d.append(c[0][1])
i = 1
while i < size  :
    # if current name = previous name, add classes
    if c[i][0]==c[i-1][0] :
        d.append(c[i][1])  
    # if current name != previous name, add name and classes
    if c[i][0]!= c[i-1][0] :
        d.append(c[i][0])
        d.append(c[i][1])
    i = i + 1

输出为

['Adam', 'PHYS 1443', 'Ashley', 'IE 3312', 'PHYS 1443', 'August', 'PHYS 1444', 'Baron', 'PHYS 1443', 'Christopher', 'IE 3301', 'CSE 1320', 'PHYS 1443', 'Dylan', 'CSE 1310', 'Henry', 'PHYS 1444', 'James', 'IE 3301', 'PHYS 1443', 'Jonathan', 'IE 3312', 'Krishna', 'CSE 1310', 'Luis', 'CSE 1310', 'Michael', 'IE 3301', 'Nang', 'PHYS 1443', 'Pramod', 'PHYS 1444', 'PHYS 1443', 'Saroj', 'IE 3301', 'MATH 1426', 'Sol', 'CSE 1310', 'Timothy', 'MATH 2325', 'IE 3301']

有什么简单的解决办法吗?你知道吗


Tags: name名称列表ifmathieclassesphys
3条回答
import itertools
print [[key, [cls[1] for cls in list(group)]]
        for key, group in itertools.groupby(data, key=lambda x: x[0])]

输出

[['Adam', ['PHYS 1443']],
 ['Ashley', ['IE 3312', 'PHYS 1443']],
 ['August', ['PHYS 1444']],
 ['Baron', ['PHYS 1443']],
 ['Christopher', ['IE 3301', 'CSE 1320', 'PHYS 1443']],
 ['Dylan', ['CSE 1310']],
 ['Henry', ['PHYS 1444']],
 ['James', ['IE 3301', 'PHYS 1443']],
 ['Jonathan', ['IE 3312']],
 ['Krishna', ['CSE 1310']],
 ['Luis', ['CSE 1310']],
 ['Michael', ['IE 3301']],
 ['Nang', ['PHYS 1443']],
 ['Pramod', ['PHYS 1444', 'PHYS 1443']],
 ['Saroj', ['IE 3301', 'MATH 1426']],
 ['Sol', ['CSE 1310']],
 ['Timothy', ['MATH 2325', 'IE 3301']]]

你可以用itertools.groupby组()如@thefourtheye或defaultdict按名称组织:

from collections import defaultdict
>>> onedlist = zip(["ADAM","JOHN"]*5,range(10))
[('ADAM', 0), ('JOHN', 1), ('ADAM', 2), ('JOHN', 3), ('ADAM', 4), ('JOHN', 5), ('ADAM', 6), ('JOHN', 7), ('ADAM', 8), ('JOHN', 9)]
>>> my_dict = defaultdict(list)
>>> for name,val in onedlist: my_dict[name].append(val)
>>> print my_dict["ADAM"]
[1,2,3,4,5]

另一种方法是将其转换为字典:

d = {}
for k,v in l: #l is your list
    if d[k]:
        d[k].append(v)
    else:
        d[k] = v

输出:

{'Krishna': ['CSE 1310'], 'Dylan': ['CSE 1310'], 'Ashley': ['IE 3312', 'PHYS 1443'], 'Baron': ['PHYS 1443'], 'Timothy': ['MATH 2325', 'IE 3301'], 'James': ['IE 3301', 'PHYS 1443'], 'Pramod': ['PHYS 1444', 'PHYS 1443'], 'Michael': ['IE 3301'], 'Sol': ['CSE 1310'], 'Nang': ['PHYS 1443'], 'Christopher': ['IE 3301', 'CSE 1320', 'PHYS 1443'], 'Adam': ['PHYS 1443'], 'Henry': ['PHYS 1444'], 'Saroj': ['IE 3301', 'MATH 1426'], 'Luis': ['CSE 1310'], 'Jonathan': ['IE 3312'], 'August': ['PHYS 1444']}

然后,打印它:

>>> for k,v in d.items(): #iterates through d
    print(k, end=' ')
    for i in v:
        print (i, end=" ")
    print()

输出:

Krishna CSE 1310 
Dylan CSE 1310 
Ashley IE 3312 PHYS 1443 
Baron PHYS 1443 
Timothy MATH 2325 IE 3301 
James IE 3301 PHYS 1443 
Henry PHYS 1444 
Michael IE 3301 
Sol CSE 1310 
Nang PHYS 1443 
August PHYS 1444 
Christopher IE 3301 CSE 1320 PHYS 1443 
Adam PHYS 1443 
Pramod PHYS 1444 PHYS 1443 
Luis CSE 1310 
Saroj IE 3301 MATH 142

将其存储在字典中也比存储在多维数组中更快、更高效。看看这个:

>>> timeit("""[['Adam', ['PHYS 1443']],
 ['Ashley', ['IE 3312', 'PHYS 1443']],
 ['August', ['PHYS 1444']],
 ['Baron', ['PHYS 1443']],
 ['Christopher', ['IE 3301', 'CSE 1320', 'PHYS 1443']],
 ['Dylan', ['CSE 1310']],
 ['Henry', ['PHYS 1444']],
 ['James', ['IE 3301', 'PHYS 1443']],
 ['Jonathan', ['IE 3312']],
 ['Krishna', ['CSE 1310']],
 ['Luis', ['CSE 1310']],
 ['Michael', ['IE 3301']],
 ['Nang', ['PHYS 1443']],
 ['Pramod', ['PHYS 1444', 'PHYS 1443']],
 ['Saroj', ['IE 3301', 'MATH 1426']],
 ['Sol', ['CSE 1310']],
 ['Timothy', ['MATH 2325', 'IE 3301']]]""")
5.6225116937032311
>>> timeit("""{'Krishna': ['CSE 1310'], 'Dylan': ['CSE 1310'], 'Ashley': ['IE 3312', 'PHYS 1443'], 'Baron': ['PHYS 1443'], 'Timothy': ['MATH 2325', 'IE 3301'], 'James': ['IE 3301', 'PHYS 1443'], 'Pramod': ['PHYS 1444', 'PHYS 1443'], 'Michael': ['IE 3301'], 'Sol': ['CSE 1310'], 'Nang': ['PHYS 1443'], 'Christopher': ['IE 3301', 'CSE 1320', 'PHYS 1443'], 'Adam': ['PHYS 1443'], 'Henry': ['PHYS 1444'], 'Saroj': ['IE 3301', 'MATH 1426'], 'Luis': ['CSE 1310'], 'Jonathan': ['IE 3312'], 'August': ['PHYS 1444']}
""")
3.4978408664244967

相关问题 更多 >