Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在没有固定宽度字段组织的情况下对输入进行排序?_Python_Csv_File Io - Fatal编程技术网

Python 如何在没有固定宽度字段组织的情况下对输入进行排序?

Python 如何在没有固定宽度字段组织的情况下对输入进行排序?,python,csv,file-io,Python,Csv,File Io,我有一个.txt文件,其中包含以下行: Name | Email@example.com | Score Name2 | Email2@madeupsite.com | Score 其中,Score是一个从0到10亿的整数 我想按分数从大到小对这个文件进行排序。我的问题是,因为姓名和电子邮件的长度不同,所以每次我可以访问时,分数并不一致。我如何克服这个问题 (我不太清楚标题怎么写,所以我希望本机构能更好地解释它;如果问题不清楚,请让我知道)首先,我们可以阅读文件的行。接下来,我们使用列表理解

我有一个.txt文件,其中包含以下行:

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输入没有一致的组织”时,你实际上只是指“没有固定宽度的字段”。但它仍然有分隔符(“|”),您可以在其上拆分,因此它确实具有一致的组织。相关:相关: