1

私は入力/出力を行っており、プログラムのロジックを理解しようとしていました。名前とコースが与えられているので、名前をアルファベット順にファイルに書き込み、その後に彼らが取ったコースを書きます。私はそれを達成し、進行中の1つのリストにすべてを書きました. 今、テキストファイルに書き込もうとしています"name, class, .....(if more than one class)" が、それを1次元リストにしたので、プログラムは名前とクラスを一緒に模索するのではなく、項目ごとに書き込みます。例、新しいファイルを読みたい

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

1 つのリストがある場合、これを行うにはどうすればよいですか。のようなものを書こうと思っていた

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

これに関する問題は、1 つのリストであり、名前の変更を検出する方法がわかりません。1 つの名前とそのクラスを含む各サブリストを 2dlist に変換する方法はありますか? これが私の元の 2 次元リストで、組織化されていない形式です。

[['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']

これに対する簡単な修正はありますか?

4

3 に答える 3

2
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']]]
于 2013-10-30T01:12:42.130 に答える
0

1 つの代替手段は、代わりに辞書に変換することです。

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
于 2013-10-30T01:23:49.023 に答える
0

@thefourtheye や defaultdict のような itertools.groupby() を使用して、名前で整理できます。

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]
于 2013-10-30T01:19:34.613 に答える