【问题标题】:Appending certain elements from a list of list into another list将列表中的某些元素附加到另一个列表中
【发布时间】:2017-05-09 09:42:23
【问题描述】:

我有一个嵌套列表,如下所示:

L = [['James', 'Bob', '23', '47'], ['Earl', 'Carl', '16', '43'], ['Milly', 'Wendy', '1', '21']]

我想从他们每个人中提取名字并将它们放入一个名为“newList”的新列表中,没有数字。

我尝试了以下代码:

for i in L[0][0]:
    newList.append(i)
print(newList)

但是,这只是打印了名字,每个字母都用逗号分隔。我希望新列表看起来像这样:

newList = ['James', 'Bob', 'Earl', 'Carl', 'Milly', 'Wendy']

【问题讨论】:

标签: python list nested


【解决方案1】:

只需使用嵌套列表推导:

In [61]: [i for sub in L for i in sub[:2]]
Out[61]: ['James', 'Bob', 'Earl', 'Carl', 'Milly', 'Wendy']

【讨论】:

    【解决方案2】:

    你需要遍历列表L中的元素

    for i in L:
        newList.append(i[0])
        newList.append(i[1])
        #or simply newList.extend(i[:2])
    print(newList)
    

    编辑

    for i in L:
        if i[0] not in newList:
            newList.append(i[0])
        if i[1] not in newList:
            newList.append(i[1])
        #or simply newList.extend(i[:2])
    print(newList)
    

    【讨论】:

    • 谢谢!我将如何更改它,以便如果我有一个重复名称的嵌套列表,它只会在新列表中打印一次名称?
    • 这里i[0]是第一个元素,i[1]是第二个元素。可以检查append之前是否相等
    • 我尝试将 if i[0] != i[1] 放在 for 语句之后和附加语句之前。然而,这只是产生了与以前相同的结果。
    • 我不理解重复的名字,是在同一个列表中还是在不同的列表中?
    • 在不同的列表中,例如:[['James', 'Alan'], ['Alan', 'James']] 它只会打印['James', 'Alan']
    【解决方案3】:

    您可以使用isdigit() 过滤掉姓名

    res = [j for i in L for j in i if not j.isdigit()]
    ['James', 'Bob', 'Earl', 'Carl', 'Milly', 'Wendy']
    

    【讨论】:

      【解决方案4】:

      分两步完成。

      首先,获取每个列表的前两个元素:

      >>> names_nested = [sub[:2] for sub in L]
      >>> names_nested
      [['James', 'Bob'], ['Earl', 'Carl'], ['Milly', 'Wendy']]
      

      然后取消嵌套此列表:

      >>> names = [name for sub in names_nested for name in sub]
      >>> names
      ['James', 'Bob', 'Earl', 'Carl', 'Milly', 'Wendy']
      

      ... 或者使用itertools.chain 更舒适:

      >>> from itertools import chain
      >>> list(chain(*(sub[:2] for sub in L)))
      ['James', 'Bob', 'Earl', 'Carl', 'Milly', 'Wendy']
      

      ... 或itertools.chain.from_iterable 去掉拆包星和一组括号。

      >>> list(chain.from_iterable(sub[:2] for sub in L))
      ['James', 'Bob', 'Earl', 'Carl', 'Milly', 'Wendy']
      

      【讨论】:

        【解决方案5】:

        如果问题只是每个子列表中的前两个元素,您可以这样做:

        from itertools import chain
        result = chain.from_iterable(sublist[:2] for sublist in L)
        

        这将产生一个链对象,你可以使用list来评估它:

        list(result)
        # ['James', 'Bob', 'Earl', 'Carl', 'Milly', 'Wendy']
        

        【讨论】:

          【解决方案6】:

          使用 numpy 对列表进行切片并将结果展平为一维列表:

          import numpy as np
          np.array(L)[:,0:2].flatten().tolist()
          Out[349]: ['James', 'Bob', 'Earl', 'Carl', 'Milly', 'Wendy']
          

          【讨论】:

            【解决方案7】:

            使用isdigit方法查看str是否为数字:

            [j for l in L for j in l if not j.isdigit()]
            

            输出:

            ['James', 'Bob', 'Earl', 'Carl', 'Milly', 'Wendy']
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2020-10-29
              • 2020-03-30
              • 2016-02-26
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多