【问题标题】:Python while loop return Nth letterPython while循环返回第N个字母
【发布时间】:2020-04-24 02:20:39
【问题描述】:

我有一个字符串列表

X=['kmo','catlin','mept']

我正在尝试编写一个循环,该循环将返回一个列表,其中包含每个单词的第 N 个字母的列表:

[['k','c','m'], ['m','a','e'],['o','t','p']]

但我尝试的所有方法都只返回一个列表中连续返回的所有字母的列表:

['k','m','o','c','a','t','l','i'.....'t'] 

这是我的代码的一个版本:

def letters(X):
    prefix=[]
    for i in X:
      j=0
      while j < len(i):
        while j < len(i):
          prefix.append(i[j])
          break
        j+=1
    return prefix

我知道我在每个单词中循环,但我不知道如何纠正它。

【问题讨论】:

  • 长度比其他单词长的单词应该怎么办?
  • 看起来你正在追求一种循环......你真的需要使用while循环来做这个还是你可以使用:res = list(zip(*X))?如果您不关心@Sayse 建议的“丢失”某些数据,那将起作用
  • 我认为很明显,预期的行为是在最短的字符串终止后停止,如预期输出所示

标签: python python-3.x string list loops


【解决方案1】:

结果列表的长度似乎是由原始列表中最小字符串的长度决定的。如果确实如此,您可以简单地这样做:

X = ['kmo','catlin','mept']

l = len(min(X, key=len))

res = [[x[i] for x in X] for i in range(l)]

返回:

print(res)  # -> [['k', 'c', 'm'], ['m', 'a', 'e'], ['o', 't', 'p']]

或者更简单的(赞@JonClemens):

res = [list(el) for el in zip(*X)]

结果相同。请注意,这是可行的,因为 zip 会在其元素之一耗尽时自动停止迭代。


如果你想填补空白,可以这么说,itertools 已经用它的zip_longest 方法支持你了。请参阅this 了解更多信息。 fillvalue 可以是您选择的任何内容;这里使用'-'来演示使用。空字符串'' 可能是生产代码的更好选择。

res = list(zip_longest(*X, fillvalue = '-'))
print(res)  # -> [('k', 'c', 'm'), ('m', 'a', 'e'), ('o', 't', 'p'), ('-', 'l', 't'), ('-', 'i', '-'), ('-', 'n', '-')]

【讨论】:

  • 或者只是res = [list(el) for el in zip(*X)],不用担心长度检查
  • 虽然我意识到您正在使用 - 清楚地显示缺少的地方,但我可能会尝试使用 '' 空字符串作为填充值(因为这可能更多如果想稍后加入子列表或将其保留为 None) 方便,因为如果以后想识别缺失值,则永远不会与字符串本身中的实际字符混淆
【解决方案2】:

试试这个

def letters(X):
    prefix=[]
    # First lets zip the list element
    zip_elemets =  zip(*X)

    for element in zip_elemets:
        prefix.append(list(element))

    return prefix

【讨论】:

    【解决方案3】:

    您可以使用zip

    output=list(zip(*X))
    print(output)
    

    *X 将解包X 中存在的所有元素。

    打开包装后,我将它们全部压缩在一起。 zip() 函数返回一个 zip 对象,它是 tuplesiterator,其中每个传递的迭代器中的第一项配对在一起,并且然后每个传递的迭代器中的第二项配对在一起等等。最后,我使用list将所有内容包装在一个列表中。


    输出

    [('k', 'c', 'm'), ('m', 'a', 'e'), ('o', 't', 'p')]
    

    如果您希望 output 成为列表列表。然后使用map

    output=list(map(list,zip(*X)))
    print(output)
    

    输出

    [['k', 'c', 'm'], ['m', 'a', 'e'], ['o', 't', 'p']]
    

    【讨论】:

    • 喜欢优雅的解决方案(尽管如果您不精通 Python,它的可读性就不是很好)
    • @shayelk 谢谢,我会马上添加解释
    • 我的意思是,虽然在您的代码中保留这种“开箱即用”的解决方案确实看起来很酷,但对于将来需要维护它的其他人来说可能很难理解。更直接的解决方案[[x[i] for x in X] for i in range(l)] 更加不言自明。
    【解决方案4】:
    X=['kmo','catlin','mept']
    y = []
    j=0
    
    for i in X:
        item =''
        for element in X :
    
            if (len(element) > j):
                item = item + element[j]
    
    
        y.append(item)
        j=j+1
    print("X = [",X,"]")
    print("Y = [",y,"]")
    

    【讨论】:

      猜你喜欢
      • 2017-11-09
      • 2014-11-23
      • 2019-02-20
      • 1970-01-01
      • 2012-12-10
      • 2023-03-16
      • 2016-07-12
      • 2018-07-11
      • 1970-01-01
      相关资源
      最近更新 更多