将仅包含字符串的列表转换为包含python中

时间:2017-10-11 22:22:30

标签: python python-3.x

我真的在努力制作python代码。任何帮助将非常感谢。我需要编写代码的函数如下。由于数字是输入中的字符串,我知道我不能以某种方式按学生的名字分开,我想我必须以某种方式将数字转换为int / float,然后以某种方式将列表按名称分成子列表(即。通过字符串)但我不知道如何实现这一目标。我知道我可以使用map(int,)将某些东西变成int但它似乎没有工作,并且等级的数量(即str我需要变成float)可以与任何输入不同

谢谢!

代码:

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]]
    '''

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

解决方案

要爱魔法列表理解!

[[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]]

击穿

列表理解很棒但很难看!因此,让我们将这个庞然大物分解成相应的部分:

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(',') ]