2017-10-11 53 views
0

我真的很努力制作Python代码。任何帮助将非常感激。我需要编写代码的功能如下。由于数字是输入中的字符串,我知道我无法通过学生的姓名进行单独分隔,我想我必须以某种方式将数字转换为int/float,然后以某种方式将名单按名称分成子列表(即按字符串)但我不知道如何做到这一点。我知道我可以使用map(int,)将东西变成int,但它似乎没有工作,并且等级数(即。我需要变成浮点数)可以与任何输入有所不同将仅有字符串的列表转换为带有字符串和浮点数的Python子列表

谢谢!

代码:

def string_list(L): 

    '''(list of str) -> list of list 
    Given a list of strings where each string has the format: 
    'name, grade, grade, grade, ...' return a new list of 
    lists where each inner list has the format : 
    [name (str), grade, grade, grade, ...] where the name 
    is a string and the grades are floats. 
    >>> string_list(['Joe, 60, 90, 80', 'Harry, 60, 70', 'Jill, 98.5, 100, 95.5, 98']) 
    [['Joe', 60.0, 90.0, 80.0], ['Harry', 60.0, 70.0], ['Jill', 98.5, 100.0, 95.5, 98.0]] 
    ''' 
+1

尝试打破问题了。你会得到一个大字符串,其中包含姓名和成绩。你怎么能把这些碎片分开? (提示:看看你的输入字符串的格式!) – bnaecker

+0

感谢您的提示!每个人的名字与他们的成绩是一个单独的字符串,所以我会看看,如果我可以以某种方式拆分每个字符串,然后可能从那里将数字转换为int。 – Rir8

+0

为了好玩(并且提醒你我们在Python中有多容易......)我[在Haskell中实现了这个](https://gist.github.com/NotTheEconomist/6e129c9f015d39100ccaa4079f140f64)。公平地说,我重新实现了'Data.Text'包中存在的'splitOn'和'strip'。我打算没有进口,但发现定义'Data.Char(isSpace)'是很乏味的。 –

回答

0
def string_list(L): 
    final_list = [] 
    for element in L: 
     new_entry = element.split(',') # Split on commas; returns a list of strings 
     new_entry = [x.strip() for x in new_entry] # Remove whitespace from each string in list 
     new_entry[1:] = [float(x) for x in new_entry[1:]] # Cast all entries but the first to float 
     final_list.append(new_entry) 
    return final_list 
+0

非常感谢您的代码和添加关于每行代码的#条评论,所以我知道发生了什么。我会试试这个! – Rir8

+0

再次感谢您的代码!关于它的两个问题,当你写element.split(',')为什么它在字符串之间的逗号分割,而不是在字符串中的逗号分割?是否可以在字符串中以逗号分隔,因为字符串是不可变的?其次,当你使用单词“元素”时,是否可以使用其他单词?为了测试这个,我把精灵而不是元素,它仍然工作这是否意味着元素可以是任何单词?如果它可能是任何单词,它究竟意味着什么?除此之外,我明白其余的谢谢! – Rir8

+0

它在字符串中以逗号分割。 'element'是原始列表的一个元素,例如“乔,60,90,80''。 'element.split(',')'返回一个字符串列表,但它们包含空格,因此附加'strip'命令。我把'split'和'strip'分成两行,使其更清晰。 –

0

解决方案

又爱的魔力oneliner列表理解!

[[float(val) if val.strip().isdigit() else val.strip() for val in person.split(',')] for person in L] 

同列表理解,但对于窄屏:

[[float(val) if val.strip().isdigit() else val.strip() 
     for val in person.split(',')] 
     for person in L ] 

使用

,你可以拍给你的函数,像这样:

def string_list(L): 
    return [[float(val) if val.strip().isdigit() else val.strip() for val in person.split(',')] for person in L] 

并使用它像这样:

>>> L = ["Joe, 60, 90, 80", "Harry, 60, 70", "Jill, 98.5, 100, 95.5, 98"] 
>>> string_list(L) 
[['Joe', 60.0, 90.0, 80.0], 
['Harry', 60.0, 70.0], 
['Jill', '98.5', 100.0, '95.5', 98.0]] 

击穿

List内涵是真棒,但难看!因此,让我们分解这个庞然大物到其相应部分:

for person in L] 

对于每个项目(如"Joe, 60, 90, 80")在我们的名单

for val in person.split(',') 

如果我们每个那些字符串分割成字符串,从而 "Joe, 60, 90, 80"列表 - >["Joe","60","90","80"]并存储迭代存储每个这些值的那些元素中的每一个("Joe""60"等),作为val

float(val) if val.strip().isdigit() else val.strip() 

如果val只由数字字符(.isdigit()),然后将其转换为一个浮点数。否则,(通过.strip()没有空格字符,例如空格)返回字符串

[[<code> for val in person.<more>] for person in L] 

内部支架组的人的要素,没有他们,你只能得到字符串的一个列表。

如果你想要一个清单,你就需要重新排序for <thing> in <list>就像这样:

[float(val) if val.strip().isdigit() else val.strip() 
    for person in L 
    for val in person.split(',') ] 
+0

非常感谢您的代码和出色的故障! – Rir8

+1

谢谢!细分实际上与我做出的方式相反,所以我认为我会展示自己的工作。简单的说一下,一条衬里很棒,但在长期(时间)代码中不是超级可持续的。对于生产代码,您确实需要确保性能提高了复杂性(调试它们)。 – Splatmistro

相关问题