根据定义的属性对变量列表进行分类

2024-09-28 20:45:26 发布

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

我正在PyCharm中运行Python3.7,我想知道如何最好地打开和读取一个文本文件,该文件包含五个多语言学生及其语言的列表,然后,我想根据每个学生是否有特定的期望语言对他们进行分类。一些学生会说一种或多种所需的语言,但我只想根据以下内容列出他们的名字

1)说阿拉伯语的学生

2)不会说阿拉伯语但会说英语的学生

3)不会说阿拉伯语或英语但会说法语的学生

students.txt(班上有5名学生[未排序])

John Arabic,
Ron French,
John French,
Jane French,
Pat English,
John French,
Jane Arabic,
Pat Spanish,
Ron English,
Sarah French,

结果如下:

John Arabic
Jane Arabic
Pat English
Ron English
Sarah French

我已经玩了好几个小时了,还没来得及弄明白。我尝试了所有的方法,从循环列表到测试列表中是否有东西,嵌套if语句,以及基本正则表达式,但我运气不太好。欢迎提出任何建议

这是我想到的,但是正在工作

def clean_up():
    final_list = []
    no_list = []
    with open('student.txt', "r") as infile:
        for lines in infile.read().strip().splitlines():
            line = lines.split()
            if lines in final_list:
                continue
            if findwholeword(line[0], 1, 'Arabic', lines) != (None or 
[]):
                no_list.append(line[0])
                final_list.append(lines)
            elif findwholeword(line[0], 1, 'English', lines) != (None 
or []):
                if line[0] in no_list:
                    continue
                elif line[0] not in no_list:
                    final_list.append(lines)
                    no_list.append(line[0])
                else:
                    print("Issue at 'NO' statement")
            elif findwholeword(line[0], 1, 'French', lines) != (None 
or []):
                if line[0] in no_list:
                    continue
                elif line[0] not in no_list:
                    final_list.append(lines)
                    no_list.append(line[0])
                else:
                   print("Issue at 'Error' statement.")
           else:
                print('Something went wrong!')


def findwholeword(w1, w2, w3, target):
    return re.compile(r'\b{0}(?:\W+\w+){{0,{1}}}\W+{2}\b'.format(w1, 
w2, w3), flags=re.IGNORECASE).search(target)

clean_up()

Tags: noin语言ifenglishlinejohn学生
3条回答

您可以使用defaultdict创建和语言到名称的映射,然后使用集合跳过已输出的名称:


from collections import defaultdict

languages = defaultdict(list)

with open('students.txt') as f_in:
    for student in f_in:
        name, lang = student.rstrip('\n,').split()
        languages[lang].append(name)

seen = set()
for lang in ['Arabic', 'English', 'French']:
    for name in languages[lang]:
        if name not in seen:
            print(name, lang)
            seen.add(name)

输出:

John Arabic
Jane Arabic
Pat English
Ron English
Sarah French

这应该起作用:

import re
f=open('students.txt',"r")
arabic_list=[]
english_list=[]
french_list=[]
for i in f.readlines():
    i=re.sub('\n','',i)
    if 'Arabic' in i:
        arabic_list.append(i)
    elif 'English' in i:
        english_list.append(i)
    else:
        french_list.append(i)

lang_dict={'arabic':arabic_list,'english':english_list,'french':french_list}
for lang in lang_dict:
    for students in lang_dict[lang]:
        print(students)

不是最优的,但可能是这样的:

with open("students.txt","r") as rawdata:
    raw_list = rawdata.readlines()

new_dict = {}

for i in raw_list:
    name, language  = i.split(" ")
    if name in new_dict.keys():
        new_dict[name] += [language[:-2]]
    else:
        new_dict[name] = [language[:-2]]

language_order_list=["Arabic","English","French"]

for language in language_order_list:
    for name in new_dict.keys():
        if language in new_dict[name]:
            print(f"{name} {language}")
            new_dict[name] = []

相关问题 更多 >