按数字降序输出两个组合列表中的项目?
Outputting items in two combined lists in descending numerical order?
我有一个如下所示的 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" 得到的每个单独分数对其进行排序,但我不能拆分列表,因为那样我会有重复的键。
您可以根据需要使用 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')]]
最后,您需要首先链接嵌套列表,然后使用排序函数和以下键根据第二个元素(分数)对该列表进行排序:
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))
您已经填写了 fileRecord
和 fileScores
。现在您将它们合并并排序:
>>> 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
而不是 Python 中的内置 zip
2.
打开文件,str.rpartition
每行将数字与名称分开。然后构建一个生成器,用它的每个数字扩展名称,对其进行排序,然后做任何你需要的输出,例如:
代码:
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
s = """Raj,Joy:9,8,1
Smith,John:8
Campbell,Michelle:5,7,9"""
使用 getKey 提供元组第二个元素作为 sorted() 的键
def getKey(item):
return item[1]
声明您的列表对象
asc_list = []
result = []
使用列表理解将输入拆分为单独的行:
asc_list = [i for i in s.split("\n")]
asc_list = [(j.split(':')[0],k) for j in asc_list for k in j.split(':')[1].split(',')]
使用 sorted 对元组项目编号 2 进行排序
result = sorted(asc_list_nums, key=getKey)
输出:
[('Raj,Joy', '1'), ('Campbell,Michelle', '5'), ('Campbell,Michelle', '7'), ('Raj,Joy', '8'), ('Smith,John', '8'), ('Raj,Joy', '9'), ('Campbell,Michelle', '9')]
Python 单行的完美示例。应用列表理解和内置 sorted
函数。
将组合列表展平为元组列表
scores = [(record, score) for record, scores in zip(fileRecord, fileScores) for score in scores]
按得分降序排列元组列表
from operator import itemgetter
sorted(scores, key=itemgetter(1), reverse=True)
一行解决问题
sorted([(record, score) for record, scores in zip(fileRecord, fileScores) for score in scores], key=itemgetter(1), reverse=True)
有用的参考资料
- Nested list comprehensions
- Sorting Mini How-To
- operator module functions allow multiple levels of sorting
我有一个如下所示的 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" 得到的每个单独分数对其进行排序,但我不能拆分列表,因为那样我会有重复的键。
您可以根据需要使用 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')]]
最后,您需要首先链接嵌套列表,然后使用排序函数和以下键根据第二个元素(分数)对该列表进行排序:
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))
您已经填写了 fileRecord
和 fileScores
。现在您将它们合并并排序:
>>> 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
而不是 Python 中的内置 zip
2.
打开文件,str.rpartition
每行将数字与名称分开。然后构建一个生成器,用它的每个数字扩展名称,对其进行排序,然后做任何你需要的输出,例如:
代码:
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
s = """Raj,Joy:9,8,1
Smith,John:8
Campbell,Michelle:5,7,9"""
使用 getKey 提供元组第二个元素作为 sorted() 的键
def getKey(item):
return item[1]
声明您的列表对象
asc_list = []
result = []
使用列表理解将输入拆分为单独的行:
asc_list = [i for i in s.split("\n")]
asc_list = [(j.split(':')[0],k) for j in asc_list for k in j.split(':')[1].split(',')]
使用 sorted 对元组项目编号 2 进行排序
result = sorted(asc_list_nums, key=getKey)
输出:
[('Raj,Joy', '1'), ('Campbell,Michelle', '5'), ('Campbell,Michelle', '7'), ('Raj,Joy', '8'), ('Smith,John', '8'), ('Raj,Joy', '9'), ('Campbell,Michelle', '9')]
Python 单行的完美示例。应用列表理解和内置 sorted
函数。
将组合列表展平为元组列表
scores = [(record, score) for record, scores in zip(fileRecord, fileScores) for score in scores]
按得分降序排列元组列表
from operator import itemgetter
sorted(scores, key=itemgetter(1), reverse=True)
一行解决问题
sorted([(record, score) for record, scores in zip(fileRecord, fileScores) for score in scores], key=itemgetter(1), reverse=True)
有用的参考资料
- Nested list comprehensions
- Sorting Mini How-To
- operator module functions allow multiple levels of sorting