【问题标题】:how do you split lines of strings to create nested list? [closed]如何拆分字符串行以创建嵌套列表? [关闭]
【发布时间】:2018-01-19 21:52:46
【问题描述】:

如何在文本文件中拆分这些字符串行并创建嵌套列表或字典?:

Ali/22/Bankacı
Ahmet/28/Kasap
Mehmet/31/Bakkal

这样您就有一个包含以下值的列表:

my_data['Ali'][1]= 'Bankacı'

哪种方法最pythonic?

【问题讨论】:

  • 您似乎希望我们为您编写一些代码。虽然许多用户愿意为陷入困境的程序员编写代码,但他们通常只在发布者已经尝试自己解决问题时才提供帮助。展示这项工作的一个好方法是包含您迄今为止编写的代码、示例输入(如果有的话)、预期输出和您实际获得的输出(控制台输出、回溯等)。您提供的详细信息越多,您可能收到的答案就越多。检查FAQHow to Ask
  • 所以其他人可以准确地问这类问题,但我不能? stackoverflow.com/questions/7680729/…我只是在寻找最pythonic的方式
  • "asked 6 years, 3 months ago"。如果有人偷窃并且当时没有被抓到,这是否意味着你可以偷窃?我所要求的只是展示你的努力,它会越来越快地吸引答案......这并不难。
  • @JoeIddon 这基本上就是minimal reproducible example 的含义,但如果您愿意,可以挖掘元帖子,例如:meta.stackexchange.com/questions/223480/…meta.stackexchange.com/a/210868元,四处搜索。哦,你可以在这里看到应该问什么类型的问题:stackoverflow.com/help/on-topic这个问题目前不适合......
  • @MooingRawr 谢谢,这些链接非常有用。

标签: python string list dictionary


【解决方案1】:

一种方法是这样的:

FILE = 'file.txt'

result = {}
with open(FILE, encoding='utf-8') as my_file:
    for line in my_file:
        line = line.strip().split('/')
        result[line[0]] = line[1:]

print(result['Ali'][1])

或者,很好地放在一个函数中:

def data_to_dict(file_path):
    """
    Some docstring here which tells the user what the function does
    """

    result = {}
    with open(file_path, encoding='utf-8') as my_file:
        for line in my_file:
            line = line.strip().split('/')
            result[line[0]] = line[1:]
    return result


if __name__ == '__main__':
    d = data_to_dict('file.txt')
    print(d['Ali'][1])

我在上面做的是:

  • 逐行读取文件(我从中删除了最后的\n
  • 对于每一行,我通过在/ 字符之后拆分字符串来创建一个列表(此时,一行将如下所示:['Ali', '22', 'Bankacı']
  • 将列表中的第一个元素用作键,将列表的其余部分用作值

!如果两个(或更多)列表中的第一个元素相同(您总是会得到最后一个的值),这将不会为您提供正确的结果


如果您还想摆脱重复键问题,替代方案可能如下所示:

def data_to_dict(file_path):
    """
    Some docstring here which tells the user what the function does
    """

    result = {}
    with open(file_path, encoding='utf-8') as my_file:
        for i, line in enumerate(my_file):
            line = line.strip().split('/')
            key, val = line[0], line[1:]

            if key not in result:
                result[key] = val
            else:
                new_key = '{}_{}'.format(key, i)
                result[new_key] = val
    return result


if __name__ == '__main__':
    d = data_to_dict('file.txt')
    print(d)
    print(d['Ali'][1])

对于这个文件:

Ali/22/Bankacı
Ali/28/Kasap
Mehmet/31/Bakkal

输出将如下所示:

>> {'Ali': ['22', 'Bankacı'], 'Ali_1': ['28', 'Kasap'], 'Mehmet': ['31', 'Bakkal']}
>> Bankacı

【讨论】:

    【解决方案2】:

    通常我不会不加尝试地回答问题,但这可以通过一行 dictionary-comprehension 轻松完成:

    {l[:l.index('/')]:l.split('/')[1:] for l in open('f.txt').read().split('\n')[:-1]}
    

    然后允许以以下格式访问:

    >>> d['Mehmet'][1]
    'Bakkal'
    

    或者,您可以创建一个2d list 和另一个comprehension

    [l.split('/') for l in open('f.txt').read().split('\n')[:-1]]
    

    给出:

    [['Ali', '22', 'Bankacı'], ['Ahmet', '28', 'Kasap'], ['Mehmet', '31', 'Bakkal']]
    

    【讨论】:

      猜你喜欢
      • 2023-03-30
      • 2014-04-26
      • 2015-05-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-02
      相关资源
      最近更新 更多