【问题标题】:Concatenate a variable number of lists in Python在 Python 中连接可变数量的列表
【发布时间】:2017-11-02 09:13:33
【问题描述】:

我有许多列表称为:index_1、index_2、index_3、....、index_n。
我想要的是将它们全部连接到一个新列表中。

到目前为止我的代码:

index_all=[]
for i in range(1,n+1):
    index_all = index_all + globals()["index_"+str(i)]   

但是,我收到一个错误:

KeyError: index_1

关于如何解决这个问题的任何想法?

【问题讨论】:

  • 这意味着全局变量中没有存储名为 index_1 的变量...应该有一个吗?
  • 是的,我想应该有吧?
  • 最佳测试:尝试通过python控制台访问globals()["index_1"]
  • 请做一个完整的代码示例,因为似乎缺少一些东西。你说你有列表list_1list_n,但我没有在你的代码中看到它们。 index_all 代表什么也不清楚。如果您只想连接列表,为什么需要列表中的任何索引?这是您要附加其他列表的所有内容的列表吗?
  • 应该是globals()["list_"+str(i)] 吗?

标签: python list concatenation


【解决方案1】:

看来您可能只是命名错误,您尝试调用“index_”+ str(i),但您的列表命名为“list_”+ str(i)。只要您的列表被命名为 list_1, list_2... list_n 并且没有中断并且您的 n 是正确的,那么以下行应该可以工作。

index_all = [globals()["list_"+str(i)] for i in range(1, n+1)]

如果你希望列表是扁平的,你可以

[item for sublist in index_all for item in sublist]

如果你可以避免使用 globals() 可能会更容易,因为它可能很脆弱!

【讨论】:

  • 不,只是问题中的一个错字,对不起。变量名确实是index_1、index_2、index_3,你的建议我已经试过了,还是不行
【解决方案2】:

您可能想要使用 map 和 filter 以及 globals().items() 功能:

concat_list  =  map ( lambda list_var : list_var[1] , filter ( lambda list_var  : list_var[0].startswith("list"), globals().items()))

您的 concat_list 是所有列表中所有项目的列表

【讨论】:

  • 这仍然意味着我想迭代我的列表,例如:all_lists=[] for i in range(1,n+1): all_lists.append(index_i) 但这会导致我们遇到同样的问题,我该如何迭代这些 index_i 列表?
  • 您可能想使用扩展并将这些列表附加到一个列表中,然后执行我的解决方案
  • 我也没有,但我希望有一些。
  • 像这样使用扩展 all_lists.extend((list_1, list_2, list_3)) 然后我的解决方案
  • 但这和上面的差不多吧?我的意思是它预先假定我手动输入我的列表。如果他们是 3,我会工作得很好,但是在我的情况下他们是 100 会发生什么?手动写入 list_1, list_2,....,list_100 不是一个好主意。
【解决方案3】:

你可以试试这个:

list1 = [[1,2,3],[4,5,6],[7,8,9]]

def joinAll(mulist):
     index_all=[]
     for i in mulist:
         for u in i:
             index_all.append(u)
     return index_all

print joinAll(list1)

【讨论】:

  • 看来我必须在函数joinAll中手动输入list1、list2、list3。假设我有 100 个列表:list1 到 list100,这显然是不起作用的。
  • @lmm 因为index_all 在函数之外,我认为返回它没有用。
  • 同时使用list.extend(another_list) 可以让你摆脱嵌套循环。
【解决方案4】:

使用列表解包

cat_list = []
for i in range(1, n+1):
    cat_list = [ *cat_list, *globals()['index_'+str(i)] ]

【讨论】:

  • 创建一个新的列表,每次解包元素,无论是列表的数量还是列表中的元素数量都非常糟糕。
  • 请改用cat_list.extend(globals()['index_'+str(i)])cat_list += globals()['index_'+str(i)]
猜你喜欢
  • 2018-06-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-22
  • 2022-08-17
  • 1970-01-01
  • 2018-12-13
  • 2012-08-09
相关资源
最近更新 更多