Python 如何在没有固定宽度字段组织的情况下对输入进行排序?
我有一个.txt文件,其中包含以下行:Python 如何在没有固定宽度字段组织的情况下对输入进行排序?,python,csv,file-io,Python,Csv,File Io,我有一个.txt文件,其中包含以下行: Name | Email@example.com | Score Name2 | Email2@madeupsite.com | Score 其中,Score是一个从0到10亿的整数 我想按分数从大到小对这个文件进行排序。我的问题是,因为姓名和电子邮件的长度不同,所以每次我可以访问时,分数并不一致。我如何克服这个问题 (我不太清楚标题怎么写,所以我希望本机构能更好地解释它;如果问题不清楚,请让我知道)首先,我们可以阅读文件的行。接下来,我们使用列表理解
Name | Email@example.com | Score
Name2 | Email2@madeupsite.com | Score
其中,Score
是一个从0到10亿的整数
我想按分数从大到小对这个文件进行排序。我的问题是,因为姓名和电子邮件的长度不同,所以每次我可以访问时,分数并不一致。我如何克服这个问题
(我不太清楚标题怎么写,所以我希望本机构能更好地解释它;如果问题不清楚,请让我知道)首先,我们可以阅读文件的行。接下来,我们使用列表理解来拆分分隔符“|”上的每一行,获取最后一个索引,并转换为整数进行排序。我们按相反顺序排序并设置键,这样输出将是行索引,然后将
lines\u sorted
设置为与已排序行的顺序相等
with open("file.txt", "r") as f:
lines = f.readlines()
scores = [int(l.split("|")[-1]) for l in lines]
sorted_idx = sorted(range(len(scores)), key=lambda k: scores[k], reverse=True)
lines_sorted = [lines[i] for i in sorted_idx]
有关排序和返回索引的更多建议,请参阅
示例
“file.txt”包含以下内容:
Name | Email@example.com | 1000
Name2 | Email2@madeupsite.com | 10
Name3 | Email3@madeupsite.com | 100
已排序的行将包含:
["Name | Email@example.com | 1000",
"Name3 | Email3@madeupsite.com | 100",
"Name2 | Email2@madeupsite.com | 10"]
首先,我们可以读取文件的行。接下来,我们使用列表理解来拆分分隔符“|”上的每一行,获取最后一个索引,并转换为整数进行排序。我们按相反顺序排序并设置键,这样输出将是行索引,然后将lines\u sorted
设置为与已排序行的顺序相等
with open("file.txt", "r") as f:
lines = f.readlines()
scores = [int(l.split("|")[-1]) for l in lines]
sorted_idx = sorted(range(len(scores)), key=lambda k: scores[k], reverse=True)
lines_sorted = [lines[i] for i in sorted_idx]
有关排序和返回索引的更多建议,请参阅
示例
“file.txt”包含以下内容:
Name | Email@example.com | 1000
Name2 | Email2@madeupsite.com | 10
Name3 | Email3@madeupsite.com | 100
已排序的行将包含:
["Name | Email@example.com | 1000",
"Name3 | Email3@madeupsite.com | 100",
"Name2 | Email2@madeupsite.com | 10"]
在列表中列出行后,可以使用排序
或排序
对其进行排序。诀窍是传递一个提取整数的键。一个选项是从最后一个|
到行尾取一个切片,并从该字符串生成一个整数rfind()
有助于:
lines = ['Name | Email@example.com | 1001',
'Name2 | Email2@madeupsite.com | 2',
'Name2 | Email2@madeupsite.com | 200'
]
s = sorted(lines, key = lambda s: int(s[s.rfind('|')+1:]))
list(s)
结果:
['Name2 | Email2@madeupsite.com | 2',
'Name2 | Email2@madeupsite.com | 200',
'Name | Email@example.com | 1001']
在列表中列出行后,可以使用排序
或排序
对其进行排序。诀窍是传递一个提取整数的键。一个选项是从最后一个|
到行尾取一个切片,并从该字符串生成一个整数rfind()
有助于:
lines = ['Name | Email@example.com | 1001',
'Name2 | Email2@madeupsite.com | 2',
'Name2 | Email2@madeupsite.com | 200'
]
s = sorted(lines, key = lambda s: int(s[s.rfind('|')+1:]))
list(s)
结果:
['Name2 | Email2@madeupsite.com | 2',
'Name2 | Email2@madeupsite.com | 200',
'Name | Email@example.com | 1001']
对每个字符串的r分区
使用自定义排序键功能
输入:
lines = ['Name | Email@example.com | 50',
'Name2 | Email2@madeupsite.com | 400',
'Name3 | Email2@madeupsite.com | 15']
输出:
sorted(lines, key=lambda x: int(x.rpartition('|')[-1]))
Out[1128]:
['Name3 | Email2@madeupsite.com | 15',
'Name | Email@example.com | 50',
'Name2 | Email2@madeupsite.com | 400']
对每个字符串的r分区
使用自定义排序键功能
输入:
lines = ['Name | Email@example.com | 50',
'Name2 | Email2@madeupsite.com | 400',
'Name3 | Email2@madeupsite.com | 15']
输出:
sorted(lines, key=lambda x: int(x.rpartition('|')[-1]))
Out[1128]:
['Name3 | Email2@madeupsite.com | 15',
'Name | Email@example.com | 50',
'Name2 | Email2@madeupsite.com | 400']
您的输入数据是PSV(管道分隔值)。您可以使用pandas.read|csv和sep='|'
:
dat = """
Name1 | Email@example.com | 456
Name2 | Email2@madeupsite.com | 123
Name44 | jimmy@yahoo.co.ar | 79
"""
import pandas as pd
df = pd.read_csv(pd.compat.StringIO(dat), sep='|', header=None)
df.sort_values(2, ascending=True)
0 1 2
2 Name44 jimmy@yahoo.co.ar 79
1 Name2 Email2@madeupsite.com 123
0 Name1 Email@example.com 456
您的输入数据是PSV(管道分隔值)。您可以使用pandas.read|csv和sep='|'
:
dat = """
Name1 | Email@example.com | 456
Name2 | Email2@madeupsite.com | 123
Name44 | jimmy@yahoo.co.ar | 79
"""
import pandas as pd
df = pd.read_csv(pd.compat.StringIO(dat), sep='|', header=None)
df.sort_values(2, ascending=True)
0 1 2
2 Name44 jimmy@yahoo.co.ar 79
1 Name2 Email2@madeupsite.com 123
0 Name1 Email@example.com 456
您的输入数据实际上是PSV(管道分隔值)。您可以使用sep='|'
阅读它。或者在每一行上执行拆分(“|”)
。然后按第3列排序。当你说“txt输入没有一致的组织”时,你实际上只是指“没有固定宽度的字段”。但它仍然有分隔符(“|”),您可以在其上拆分,因此它确实具有一致的组织。相关:相关:您的输入数据实际上是PSV(管道分隔值)。您可以使用sep='|'
阅读它。或者在每一行上执行拆分(“|”)
。然后按第3列排序。当你说“txt输入没有一致的组织”时,你实际上只是指“没有固定宽度的字段”。但它仍然有分隔符(“|”),您可以在其上拆分,因此它确实具有一致的组织。相关:相关: