Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/355.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/apache-flex/4.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
将外部文本文件中的名称排序为常用名称(M、F和ALL)-Python 3_Python - Fatal编程技术网

将外部文本文件中的名称排序为常用名称(M、F和ALL)-Python 3

将外部文本文件中的名称排序为常用名称(M、F和ALL)-Python 3,python,Python,这是我的第一篇帖子,因为我似乎找不到解决问题的方法。我有一个文本文件,其中包含一个简单的逐行列表,列表中的不同名称通过旁边的M或F来区分男性和女性。一个简单的例子是: John M John M Jim M Jim M Jim M Jim M Sally F Sally F 您会注意到名称重复,因为我希望python代码计算出现最多的名称,并提供最常见的名称、男性名称和女性名称的列表。我对python非常陌生,对许多元素的理解充其量也很有限。您

这是我的第一篇帖子,因为我似乎找不到解决问题的方法。我有一个文本文件,其中包含一个简单的逐行列表,列表中的不同名称通过旁边的M或F来区分男性和女性。一个简单的例子是:

John   M

John   M

Jim    M

Jim    M

Jim    M

Jim    M

Sally  F

Sally  F

您会注意到名称重复,因为我希望python代码计算出现最多的名称,并提供最常见的名称、男性名称和女性名称的列表。我对python非常陌生,对许多元素的理解充其量也很有限。

您只是想将名称分为M和F类吗

如果您只有两个类别,只需手动将其分组:

>>> >>> people = [('Mark', 'M'), ('Susan', 'F'), ('Mary', 'F'), ('Jake', 'M')]
>>> M_names = [ name for name, gender in people if gender == 'M' ]
>>> F_names = [ name for name, gender in people if gender == 'F' ]
>>> M_names, F_names
(['Mark', 'Jake'], ['Susan', 'Mary'])
但是,随着类别的增加(未声明的性别、不完全是男性/女性的人,或者根据性别以外的内容进行分组),
itertools
可以为您提供更好的解决方案:

>>> people = [('Mark', 'M'), ('Susan', 'F'), ('Mary', 'F'), ('Jake', 'M'), ('Morgan', 'Undeclared')]
>>> dict((k, list(name for name, _ in g)) for k, g in itertools.groupby(sorted(people, key=lambda p: p[1]), key=lambda p: p[1]))
{'Undeclared': ['Morgan'], 'M': ['Mark', 'Jake'], 'F': ['Susan', 'Mary']}
这是一个相当复杂的单行线,但概念上很简单。首先,我们必须按键对数据进行排序,这是因为
groupby
将按照数据出现的顺序进行排序,如果数据中存在非连续组,则将创建单独的组。然后,我们将排序后的数据传递给
groupby
,后者返回一个迭代器,该迭代器生成一个类型的元组和另一个具有该类型的数据元素迭代器。我们将其传递给
dict
以创建类型字典->具有该类型的名称列表(剥离每个元组的第二个类型元素以避免冗余)

您也可以将该行写为:

>>> genders_to_names = {}
>>> sorted_by_gender = sorted(people, key=lambda p: p[1]) # [('Susan', 'F'), ('Mary', 'F'), ('Mark', 'M'), ('Jake', 'M'), ('Morgan', 'Undeclared')]
>>> for gender, names in itertools.groupby(sorted_by_gender, key=lambda p: p[1]):
...     genders_to_names[gender] = list(name for name, _ in names)
>>> print(genders_to_names)
{'Undeclared': ['Morgan'], 'M': ['Mark', 'Jake'], 'F': ['Susan', 'Mary']} # same as before
但谁想这么做呢;)

数数很容易!只需导入
集合
并使用
计数器

>>> collections.Counter(['Mark', 'Mark', 'Joe', 'John'])
Counter({'Mark': 2, 'John': 1, 'Joe': 1})
>>> collections.Counter(['Mark', 'Mark', 'Joe', 'John'])['Mark']
2

这是一个完整的程序,它读取一个命名文件并打印每个性别中最常见的五个名字

#!/usr/bin/python

import sys
import collections

with open(sys.argv[1]) as file:
  lines = [line.split() for line in file]
males = collections.Counter(name for (name, gender) in lines if gender == 'M')
femes = collections.Counter(name for (name, gender) in lines if gender == 'F')

print males.most_common(5)
print femes.most_common(5)

stdlib中有一个类听起来非常适合解决您的问题python太神奇了<代码>计数器(line.strip(),用于打开(文件)中的行,如果line!='\n')–@rotn194的答案更好,但我喜欢制作这样的快速东西是多么容易。