【问题标题】:Adding each character in a line of input file to list, and adding each list to another list after each line将输入文件的一行中的每个字符添加到列表中,并在每行之后将每个列表添加到另一个列表中
【发布时间】:2016-11-06 04:52:21
【问题描述】:

基本上我要做的是将每一行中的每个字符读入一个列表,然后在每一行之后,将该列表添加到另一个列表中(输入文件中每行一个列表,每个列表包含每行)

这是我目前所拥有的,但它似乎不起作用,我不知道为什么。

allseq = []
with open("input.txt", "r") as ins:
    seq = []
    for line in ins:
        for ch in line:
            if ins != "\n":
                seq.append(ch)
            else:
                allseq.append(seq)
                seq[:] = []

print(allseq)

【问题讨论】:

    标签: python list io


    【解决方案1】:

    Python 中的字符串可以很容易地转换成文字列表!让我们做一个函数。

    def get_char_lists(file):
        with open(file) as f:
            return [list(line.strip()) for line in f.readlines()]
    

    这会打开一个文件进行读取,读取所有行,去除多余的空格,将字符列表粘贴到列表中,然后返回最后一个列表。

    【讨论】:

    • 谢谢!这是一个更优雅的解决方案。
    • @Matt,没问题!必须从某个地方开始! :)
    【解决方案2】:

    即使有更简单的方法(@Pierce 回答),您的原始代码也存在两个问题。第二点很重要。

    allseq = []
    with open("input.txt", "r") as ins:
        seq = []
        for line in ins:
            for ch in line:
                if ch != "\n":         # Use ch instead of ins here.
                    seq.append(ch)
                else:
                    allseq.append(seq)
                    seq = []           # Don't clear the existing list, start a new one.
    
    print(allseq)
    

    测试文件:

    this is
    some input
    

    输出:

    [['t', 'h', 'i', 's', ' ', 'i', 's'], ['s', 'o', 'm', 'e', ' ', 'i', 'n', 'p', 'u', 't']]
    

    为了阐明为什么需要第二次修复,当您将对象附加到列表时,对该对象的引用将放置在列表中。因此,如果您稍后更改该对象,则列表的显示内容会发生变化,因为它引用了同一个对象。 seq[:] = [] 将原始列表变为空。

    >>> allseq = []
    >>> seq = [1,2,3]
    >>> allseq.append(seq)
    >>> allseq                # allseq contains seq
    [[1, 2, 3]]
    >>> seq[:] = []           # seq is mutated to be empty
    >>> allseq                # since allseq has a reference to seq, it changes too.
    [[]]
    >>> seq.append(1)         # change seq again
    >>> allseq                # allseq's reference to seq displays the same thing.
    [[1]]
    >>> allseq.append(seq)    # Add another reference to the same list
    >>> allseq                
    [[1], [1]]
    >>> seq[:]=[]             # Clearing the list shows both references cleared.
    >>> allseq
    [[], []]
    

    您可以看到 allseq 包含与 id() 相同的对 seq 的引用:

    >>> id(seq)
    46805256
    >>> id(allseq[0])
    46805256
    >>> id(allseq[1])
    46805256
    

    seq = [] 创建一个具有不同 ID 的新列表,而不是改变同一个列表。

    【讨论】:

    • 哦,我应该指出他哪里出错了。感谢您填写!除了学习更好的方法来实现他的目标之外,能够从他的错误中吸取教训对 OP 来说绝对有用。
    【解决方案3】:

    如果您或其他任何人更喜欢单排,这里是(基于 Pierce Darragh 的出色回答):

    allseq = [list(line.strip()) for line in open("input.txt").readlines()]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-20
      相关资源
      最近更新 更多