【问题标题】:Python: Lists within lists - function that adds string to item in parent list without affecting child list?Python:列表中的列表 - 将字符串添加到父列表中的项目而不影响子列表的函数?
【发布时间】:2013-04-06 22:46:58
【问题描述】:

我使用以下方法生成了一个列表列表:

board = []
for i in range(0,5):
    board.append(["#"] * 4)

返回:

 [['#', '#', '#', '#'], ['#', '#', '#', '#'], ['#', '#', '#', '#'], ['#', '#', '#', '#'], ['#', '#', '#', '#']]

并使用此功能将它们打印在单独的行上:

def print_board(board):
for row in board:
    print row

哪些输出:

['#', '#', '#', '#']
['#', '#', '#', '#']
['#', '#', '#', '#']
['#', '#', '#', '#']
['#', '#', '#', '#']

我正在寻找某种方法,可以让我编辑“板”列表中的项目,将字符串添加到“板”中的项目,但不改变已经是“板”中项目的子列表。

例如,board[0].function('A') 会使 'board' 返回类似:

[['#', '#', '#', '#'] A, ['#', '#', '#', '#'], ['#', '#', '#', '#'], ['#', '#', '#', '#'], ['#', '#', '#', '#']]

print_board 函数会返回:

['#', '#', '#', '#'] A
['#', '#', '#', '#']
['#', '#', '#', '#']
['#', '#', '#', '#']
['#', '#', '#', '#']

我想我的问题的一个浓缩版本是:是否有一个函数可以将字符串添加到列表中的项目,这些项目本身就是列表,或者这只是不可能的语法?

感谢您的帮助。

【问题讨论】:

    标签: python string list python-2.7


    【解决方案1】:

    您可以将其用作生成矩阵的更简单方法:

    >>> LoL=[['#']*4 for i in range(5)]
    >>> LoL
    [['#', '#', '#', '#'], ['#', '#', '#', '#'], ['#', '#', '#', '#'], ['#', '#', '#', '#'], ['#', '#', '#', '#']]
    

    并使用 .insert 将元素添加到给定位置的列表中:

    >>> LoL.insert(1,'A')
    >>> LoL
    [['#', '#', '#', '#'], 'A', ['#', '#', '#', '#'], ['#', '#', '#', '#'], ['#', '#', '#', '#'], ['#', '#', '#', '#']]
    

    问题可能在于混合类型。您可以通过使用更多级别的列表来解决此问题:

    >>> LoL=[[['#']*4] for i in range(5)]
    >>> LoL
    [[['#', '#', '#', '#']], [['#', '#', '#', '#']], [['#', '#', '#', '#']], [['#', '#', '#', '#']], [['#', '#', '#', '#']]]
    

    然后你可以使用 append 代替 insert:

    >>> LoL[0].append('A')
    >>> LoL
    [[['#', '#', '#', '#'], 'A'], [['#', '#', '#', '#']], [['#', '#', '#', '#']], [['#', '#', '#', '#']], [['#', '#', '#', '#']]]
    

    然后打印更容易,因为列表是同质的:

    >>> print '\n'.join(str(i)[1:-1] for i in LoL)
    ['#', '#', '#', '#'], 'A'
    ['#', '#', '#', '#']
    ['#', '#', '#', '#']
    ['#', '#', '#', '#']
    ['#', '#', '#', '#']
    

    您还可以为每一行使用字典:

    >>> d={i:l for i,l in enumerate(LoL)}   #assuming that is just a LoL
    >>> d
    {0: [['#', '#', '#', '#']], 1: [['#', '#', '#', '#']], 2: [['#', '#', '#', '#']], 3: [['#', '#', '#', '#']], 4: [['#', '#', '#', '#']]}
    >>> d[0].append('A')
    >>> d
    {0: [['#', '#', '#', '#'], 'A'], 1: [['#', '#', '#', '#']], 2: [['#', '#', '#', '#']], 3: [['#', '#', '#', '#']], 4: [['#', '#', '#', '#']]}
    >>> d[0]
    [['#', '#', '#', '#'], 'A']
    

    然后通过对字典的键进行排序来打印:

    >>> print '\n'.join(str(d[k])[1:-1] for k,v in sorted(d.items()) )
    ['#', '#', '#', '#'], 'A'
    ['#', '#', '#', '#']
    ['#', '#', '#', '#']
    ['#', '#', '#', '#']
    ['#', '#', '#', '#']
    

    编辑

    你可以这样打印:

    >>> for row in LoL:
    ...    for items in row:
    ...        print items,
    ...    print
    ... 
    ['#', '#', '#', '#'] A
    ['#', '#', '#', '#']
    ['#', '#', '#', '#']
    ['#', '#', '#', '#']
    ['#', '#', '#', '#']
    

    【讨论】:

    • 您的方法似乎按我想要的方式工作,但是有没有办法从 A 中删除引号?
    【解决方案2】:

    创建一个新类,如下所示:

    class Row(list):
        def __init__(self, *args, **kw):
            list.__init__(self, *args, **kw)
            self._str = ''
    
        def add(self, value):
            self._str += value
    
        def __str__(self):
            return list.__str__(self) + ' ' + self._str
    
    board = []
    for i in range(0,5):
        board.append(Row(["#"] * 4))
    
    def print_board(board):
        for row in board:
            print row
    
    board[0].add('A')
    
    print_board(board)
    

    【讨论】:

      【解决方案3】:

      您是否尝试将项目附加到列表中的列表?也许你可以尝试类似

      list[1].append("string")

      并将 1 替换为列表在大列表中的位置。或者,可以用一个列表分配一个新变量并将该变量附加到一个列表中,这样会更容易和更直接。

      对不起,如果我不明白你的问题。我不是以英语为母语的人。

      【讨论】:

        【解决方案4】:

        您可以将任何您想要的内容添加到列表中,并根据需要在其中组合项目,但是在上面的示例中,字符串“A”以某种方式浮动,并没有真正成为列表的一部分,因此语法不没道理。

        如果您只想以某种方式拥有可以动态增长的行,您可以将列表放在列表中(表示一行),这样您就可以将(任何类型的)项目添加到行中,如下所示:

        board = [
        [['#', '#', '#', '#'], 'A'],
        [['#', '#', '#', '#']]
        [['#', '#', '#', '#']]
        [['#', '#', '#', '#']]
        [['#', '#', '#', '#']]]
        

        要访问第一行并添加“A”,您只需:board[0].append('A')

        我希望这能回答你的问题。

        【讨论】:

          猜你喜欢
          • 2017-02-15
          • 1970-01-01
          • 1970-01-01
          • 2017-08-06
          • 1970-01-01
          • 2023-03-23
          • 1970-01-01
          • 2017-02-20
          • 1970-01-01
          相关资源
          最近更新 更多