以降序数字顺序输出两个组合列表中的项目?

2024-05-23 20:22:08 发布

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

我有一个txt文件,如下所示:

Raj,Joy:9,8,1

Smith,John:8

Campbell,Michelle:5,7,9

注意:文本文件中的文本行之间没有空行

我想按数字降序输出每个人的每个结果,例如

Campbell,Michelle:9

Raj,Joy:9

Raj,Joy:8

Smith,John:8

Campbell,Michelle:7

etc.

到目前为止,我掌握的代码是:

            data = src.readlines()
            for line in data:
                record = line.split(':')
                scoreList = record[1].split(',')
                # Add name to fileRecord
                for n in scoreList:
                    fileRecord.append(record[0])

                # Two dimensional list created, each item is one set of scores
                fileScores.append(scoreList)

其中src是文本文件。 给我带来的主要问题是,如果调用sortList上的.sort(),我会丢失顺序,因此无法将每个分数与其对应的名称进行匹配。如果我要创建一个字典,问题是将排序后的数据作为排序单独输出

{"Raj,Joy":[9,8,1],etc}

不会按“Raj,Joy”得到的每个分数进行排序,但我不能拆分列表,因为那样我会有重复的键。你知道吗


Tags: srcfordata排序lineetcrecordjohn
3条回答

您已经填写了fileRecordfileScores。现在将它们合并并排序:

>>> fileRecord = ['Raj,Joy', 'Smith,John', 'Campbell,Michelle']

>>> fileScores = [[9, 8, 1], [8], [5, 7, 9]]

>>> comb = []

>>> for record, scores in zip(fileRecord, fileScores):
...     for score in scores:
...         comb.append((record, score))
...         

>>> comb
>>> 
[('Raj,Joy', 9),
 ('Raj,Joy', 8),
 ('Raj,Joy', 1),
 ('Smith,John', 8),
 ('Campbell,Michelle', 5),
 ('Campbell,Michelle', 7),
 ('Campbell,Michelle', 9)]

>>> comb.sort(key=lambda item: item[1], reverse=True)

>>> comb
>>> 
[('Raj,Joy', 9),
 ('Campbell,Michelle', 9),
 ('Raj,Joy', 8),
 ('Smith,John', 8),
 ('Campbell,Michelle', 7),
 ('Campbell,Michelle', 5),
 ('Raj,Joy', 1)]

您可能希望使用itertools.izip而不是python2中的内置zip。你知道吗

打开文件,然后str.rpartition每行将数字与名称分开。然后构建一个生成器,用每个数字展开name,排序,然后执行输出所需的任何操作,例如:

代码:

with open('input_file') as fin:
    name_nums = (line.rpartition(':')[::2] for line in fin)
    expanded = ((name, int(n)) for name, num in name_nums for n in num.split(','))
    ordered = sorted(expanded, key=lambda L: L[1], reverse=True)
    for name, num in ordered:
        print '{}:{}'.format(name, num)

输出

Raj,Joy:9
Campbell,Michelle:9
Raj,Joy:8
Smith,John:8
Campbell,Michelle:7
Campbell,Michelle:5
Raj,Joy:1

您可以将sorted函数用于key

>>> s="""Raj,Joy:9,8,1
... 
... Smith,John:8
... 
... Campbell,Michelle:5,7,9"""

>>> l=s.split('\n\n')
>>> from itertools import chain    
>>> for i in sorted(chain(*[[(i[0],j) for j in i[1].split(',')] for i in [i.split(':') for i in l]]),key=lambda x: x[1],reverse=True) :
...   print ':'.join(i)
... 
Raj,Joy:9
Campbell,Michelle:9
Raj,Joy:8
Smith,John:8
Campbell,Michelle:7
Campbell,Michelle:5
Raj,Joy:1

因此,我们在上面一行代码中的所有内容如下:

首先,我们用两个新行('\n\n')拆分文本并将其放入l

l=s.split('\n\n') 
>>> l
['Raj,Joy:9,8,1', 'Smith,John:8', 'Campbell,Michelle:5,7,9']

然后您需要创建一个包含姓名和分数的配对列表:

>>> [[(i[0],j) for j in i[1].split(',')] for i in [i.split(':') for i in l]]
[[('Raj,Joy', '9'), ('Raj,Joy', '8'), ('Raj,Joy', '1')], [('Smith,John', '8')], [('Campbell,Michelle', '5'), ('Campbell,Michelle', '7'), ('Campbell,Michelle', '9')]]

最后,您需要首先链接嵌套列表,然后使用排序函数和以下键根据第二个元素(score)对该列表进行排序:

key=lambda x: x[1]

如果要写入文件:

with open ('sample_file','w') as f :
     for i in sorted(chain(*[[(i[0],j) for j in i[1].split(',')] for i in [i.split(':') for i in l]]),key=lambda x: x[1],reverse=True) :
        f.write(':'.join(i))

相关问题 更多 >