【问题标题】:Creating a list where each list[j] is the character j from each element in another list of strings创建一个列表,其中每个 list[j] 是另一个字符串列表中每个元素的字符 j
【发布时间】:2019-10-08 17:31:36
【问题描述】:

例如:

list1 = ['abc','def','ghi','jk'`] 
output is : list2 = ['adgj','behk','cfi']

基本上list2 中的每个元素i 应该是list1 的每个元素中的第i 个字符。

我知道一般格式类似于使用以下元素创建 list2 直到每个元素的结尾。

[list1[0][0]
[list1[0][1]
[list1[0][2]

....

但是,当我尝试创建 for 循环时,它说我没有索引,并且如果 list1 中的最后一个元素比其他元素小,我还在努力让索引停止。我只需要一些关于如何设置 for 循环的指导吗?

for I in range(Len(list1)):
  list2[I]=list1[I][0]

我知道我需要第二个 for 循环来更改索引 0,但在实现时遇到了麻烦

【问题讨论】:

  • 你的预期输出是什么?
  • 你的例子正确吗?为什么list2 有两次e
  • from itertools import zip_longest; result = list(map(''.join, zip_longest(*List1, fillvalue='')))
  • 您应该遍历最小长度列表。 for I in range(min(len(list1), len(list2)):。这应该可以解决问题

标签: python list for-loop nested-loops


【解决方案1】:

你可以这样做:

list1 = ['abc','def','ghi','jk']

max_length = max(map(len, list1))

result = []
for i in range(max_length):
    element = []
    for s in list1:
        element.append(s[i] if i < len(s) else "")
    result.append(''.join(element))

print(result)

外层循环遍历所有可能的索引,内层循环遍历单词,行:

s[i] if i < len(s) else ""

如果 i 在界限内,则检索 s[i]。虽然最pythonic(正如@juanpa.arrivillaga 提到的)方式是这样做:

from itertools import zip_longest

list1 = ['abc', 'def', 'ghi', 'jk']

result = list(map(''.join, zip_longest(*list1, fillvalue='')))

print(result)

输出

['adgj', 'behk', 'cfi']

虽然,后者是一个有点高级的解决方案。

【讨论】:

  • 更多pythonicity,[''.join(x) for x in zip_longest(*list1, fillvalue='')].
【解决方案2】:

您可以使用itertools.zip_longest 来执行此操作,正如@juanpa.arrivillaga 在 cmets 中所说:

list(map(''.join, zip_longest(*list1, fillvalue='')))

或手动:

result = [''] * max(map(len, list1))
for i in range(len(result)):
    for s in list1:
      if i  < len(s):  result[i] += s[i]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-24
    相关资源
    最近更新 更多