【问题标题】:In Python, how do you create a 2D list from a file and assign a type to each item in each sublist?在 Python 中,如何从文件创建 2D 列表并为每个子列表中的每个项目分配类型?
【发布时间】:2015-11-09 22:07:41
【问题描述】:

对不起,如果这是一个尴尬的标题。这是我想做的:

  1. 读取一个txt文件,每行包含:国名、地区、人口
  2. 每一行都变成一个主列表中的一个子列表
  3. 每个子列表都需要保留变量的类型,所以:每个子列表的string,float,int

一个长输出的示例是:

[['Afghanistan', '647500.0', '25500100'], ['Albania', '28748.0', '2821977'], ['Algeria', '2381740.0', '38700000'], ['American Samoa', '199.0', '55519'], ['Andorra', '468.0', '76246']

等...而python需要知道每个变量的类型,例如,如果我想创建一个对列表中所有浮点数进行排序的新函数。

这是我现在所拥有的,但它只将每一行作为子列表返回,如果我想将此二维列表用于新功能,我相信不知道类型。

def Countries(filename):
f = open(filename)
lines = f.readlines()
f.close()
myList = []
for line in lines:
    myList.append(line.strip().split(','))
return myList

【问题讨论】:

    标签: python list types 2d


    【解决方案1】:

    也许这就是你要找的东西:

    def Countries(filename):
        f = open(filename)
        myList = []
        for line in f.readlines():
            line_data = line.split(",")
            myList.append(line_data)
        return myList
    

    但是,如果它是一个 .txt 文件,我认为它只会返回字符串。因此,您必须转换类型。

    【讨论】:

    • 如果你不介意我问,你如何转换类型?这就是我挂断的。我不确定如何在将项目放入子列表时进行转换,或者我是否必须在之后执行此操作。
    • 如果您知道 absolute 确定每个列表将是 [string, float, int],在 line_data 下您可以添加如下转换行:line_data = [line_data[0 ], float(line_data[1]), int(line_data[2])] 否则,为了安全起见,您可能需要使用下面 R Nar 发布的 typeCheck 函数。
    • 我的男人!是的,这是绝对肯定的,所以它会以这种方式工作。非常感谢,我开始更好地理解这个概念了。
    • 很高兴我能提供帮助。
    【解决方案2】:

    您遇到的主要问题是f.readlines() 将所有内容都读取为字符串。然后,您可以通过这样的类型检查器映射子列表中的每个项目:

    def typeCheck(s):
        try:
            return int(s)
        except ValueError:
            try:
                return float(s)
            except:
                return s
    

    将尝试将您的参数显式转换为“int”,然后是“float”,然后保持原样。这是这个顺序,因为所有可以转换为“int”的东西也可以转换为“float”,但不是相反,所以你想首先检查int(即'123.1'会引发int('123.1') 的错误但不是 float('123.1'))

    然后您可以像这样附加映射列表:

    for line in lines:
        myList.append(list(map(typeCheck,line.strip().split(',')))
    

    并且您可以转换为浮点数和整数的值将被转换。

    示例:

    >>> def typeCheck(s):
        try:
            return int(s)
        except ValueError:
            try:
                return float(s)
            except:
                return s
    
    
    >>> l = [['Afghanistan', '647500.0', '25500100'], ['Albania', '28748.0', '2821977'], ['Algeria', '2381740.0', '38700000'], ['American Samoa', '199.0', '55519'], ['Andorra', '468.0', '76246']]
    >>> for i in l: print(list(map(typeCheck,i)))
    
    ['Afghanistan', 647500.0, 25500100]
    ['Albania', 28748.0, 2821977]
    ['Algeria', 2381740.0, 38700000]
    ['American Samoa', 199.0, 55519]
    ['Andorra', 468.0, 76246]
    

    【讨论】:

    • 谢谢!现在我正在决定是使用你的还是杰里米的……这都是诀窍:)
    猜你喜欢
    • 1970-01-01
    • 2017-08-19
    • 2020-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多