Python 简单逻辑错误(组织列表)

Python 简单逻辑错误(组织列表),python,Python,我在做输入输出,我的任务的目标是按字母顺序打印姓名,如果一个姓名中有两个以上的类,请用两个类打印姓名 joward 2302 issac 2305 issac 2245 输出应该是 issac 2305, 2305 joward 2302 下面是我的列表,我按照名称的字母顺序创建,然后是他们的类(名称重复) 我的代码是 r = 0 while r < size - 2 : if c[r] == c[r+2] : outstring = "%s, %

我在做输入输出,我的任务的目标是按字母顺序打印姓名,如果一个姓名中有两个以上的类,请用两个类打印姓名

 joward 2302
 issac 2305
 issac 2245
输出应该是

issac 2305, 2305
joward 2302
下面是我的列表,我按照名称的字母顺序创建,然后是他们的类(名称重复)

我的代码是

r = 0
while r < size - 2 :    
    if c[r] == c[r+2] :
        outstring = "%s, %s, %s\n" % (c[r],c[r+1],c[r+3]) #  
    else :                                                   
        outstring = "%s,%s\n" % (c[r], c[r+1])             

    outfile.write(outstring)
    r = r + 2

我的逻辑哪里出错了?

一个
OrderedDict
在这里更合适,名字作为键:

>>> from collections import OrderedDict
>>> lis = ['Adam', 'PHYS 1444', 'Ajoy', 'MATH 1426', 'Ajoy', 'CSE 2315', 'August', 'CSE 1320', 'August', 'CSE 2315', 'Chiao-Lin', 'PHYS 1443', 'Dylan', 'CSE 2315', 'Isis', 'CSE 3380', 'James', 'PHYS 1443', 'Jonathan', 'PHYS 1444', 'Jonathan', 'CSE 3380', 'Katherine', 'MATH 2325', 'Michael', 'CSE 1320', 'Randal', 'IE 3312', 'Saroj', 'PHYS 1443', 'Taesu', 'PHYS 1444', 'Taesu', 'CSE 2315', 'Taesu', 'CSE 3380', 'Timothy', 'CSE 3380', "Tre'Shaun", 'CSE 1320']
>>> my_dict = OrderedDict()
>>> for name, marks in zip(*[iter(lis)]*2): 
        my_dict.setdefault(name, []).append(marks)
...     
>>> for k, v in my_dict.items():
...     print k, v
...     
Adam ['PHYS 1444']
Ajoy ['MATH 1426', 'CSE 2315']
August ['CSE 1320', 'CSE 2315']
Chiao-Lin ['PHYS 1443']
Dylan ['CSE 2315']
Isis ['CSE 3380']
James ['PHYS 1443']
Jonathan ['PHYS 1444', 'CSE 3380']
Katherine ['MATH 2325']
Michael ['CSE 1320']
Randal ['IE 3312']
Saroj ['PHYS 1443']
Taesu ['PHYS 1444', 'CSE 2315', 'CSE 3380']
Timothy ['CSE 3380']
Tre'Shaun ['CSE 1320']

如果输入列表中的名称未排序,则使用正常的
dict
defaultdict(list)
,并在迭代过程中使用
排序的

for k, v in sorted(my_dict.items()):

这将是伟大的代码审查。这不是全部的代码,你能把你的全部代码?我们中的许多人都希望自己运行代码。我不认为这里真的需要
OrderedDict
,您可以在输出过程中对键进行排序。根据任务的性质,我假设输入不能保证排序,但输出必须按字母顺序(或按类名或任何其他标准)排序。绝对没有明显的理由来保持输入的顺序,当有人阅读此代码时,这将是一个WTF时刻。此任务的复杂性差异可以忽略不计,即使不是,也会在分析过程中发现。
>>> from collections import OrderedDict
>>> lis = ['Adam', 'PHYS 1444', 'Ajoy', 'MATH 1426', 'Ajoy', 'CSE 2315', 'August', 'CSE 1320', 'August', 'CSE 2315', 'Chiao-Lin', 'PHYS 1443', 'Dylan', 'CSE 2315', 'Isis', 'CSE 3380', 'James', 'PHYS 1443', 'Jonathan', 'PHYS 1444', 'Jonathan', 'CSE 3380', 'Katherine', 'MATH 2325', 'Michael', 'CSE 1320', 'Randal', 'IE 3312', 'Saroj', 'PHYS 1443', 'Taesu', 'PHYS 1444', 'Taesu', 'CSE 2315', 'Taesu', 'CSE 3380', 'Timothy', 'CSE 3380', "Tre'Shaun", 'CSE 1320']
>>> my_dict = OrderedDict()
>>> for name, marks in zip(*[iter(lis)]*2): 
        my_dict.setdefault(name, []).append(marks)
...     
>>> for k, v in my_dict.items():
...     print k, v
...     
Adam ['PHYS 1444']
Ajoy ['MATH 1426', 'CSE 2315']
August ['CSE 1320', 'CSE 2315']
Chiao-Lin ['PHYS 1443']
Dylan ['CSE 2315']
Isis ['CSE 3380']
James ['PHYS 1443']
Jonathan ['PHYS 1444', 'CSE 3380']
Katherine ['MATH 2325']
Michael ['CSE 1320']
Randal ['IE 3312']
Saroj ['PHYS 1443']
Taesu ['PHYS 1444', 'CSE 2315', 'CSE 3380']
Timothy ['CSE 3380']
Tre'Shaun ['CSE 1320']
for k, v in sorted(my_dict.items()):
inp = ['Adam', 'PHYS 1444', 'Ajoy', 'MATH 1426', 'Ajoy', 'CSE 2315', 
'August', 'CSE 1320', 'August', 'CSE 2315', 'Chiao-Lin', 'PHYS 1443', 
'Dylan', 'CSE 2315', 'Isis', 'CSE 3380', 'James', 'PHYS 1443', 'Jonathan', 
'PHYS 1444', 'Jonathan', 'CSE 3380', 'Katherine', 'MATH 2325', 'Michael', 
'CSE 1320', 'Randal', 'IE 3312', 'Saroj', 'PHYS 1443', 'Taesu', 'PHYS 1444', 
'Taesu', 'CSE 2315', 'Taesu', 'CSE 3380', 'Timothy', 'CSE 3380', "Tre'Shaun", 
'CSE 1320']


tup_list = [tuple(ele.split()) for ele in inp]

_dict = {}

for ele in tup_list:
    if not ele[0] in _dict and len(ele) > 1:
        _dict[ele[0]] = [ele[1]] 
    elif ele[0] in _dict and len(ele) > 1:
        _dict[ele[0]].append(ele[1])
    elif len(ele) == 1:
        _dict[ele[0]] = []

print _dict