【问题标题】:how to create a sub list for a specific string in a nested list如何为嵌套列表中的特定字符串创建子列表
【发布时间】:2012-03-26 00:40:48
【问题描述】:

我有 Python 嵌套列表,我正在尝试组织并最终计算出现次数。嵌套列表如下所示:

[['22', '1'], ['21', '15'], ['11', '3'], ['31', '4'], ['41', '13'],...]

我要做的第一件事是创建一个仅包含与嵌套列表中的第二项对应的“1”的子列表。我可以通过以下命令做到这一点:

Subbasin_1 = []
Subbasin_1.append([x for x in Subbasins_Imp if x[1] == '1'])
print Subbasin_1

给出这些正确的结果:

[['21', '1'], ['21', '1'], ['21', '1'], ['21', '1'], ['22', '1'],...]

现在我想创建另一个子列表,它将为 Subbasin_1 的每个嵌套列表中提供所有“21”。当我使用同一行脚本但更改了相应的项目时,我得到一个空列表。不知道发生了什么...?

OS_Count1 = []
OS_Count1.append([x for x in Subbasin_1 if x[0] == '21'])
print OS_Count1

结果是 [[]] ???两者有什么区别? 感谢您的帮助...

【问题讨论】:

    标签: python list nested


    【解决方案1】:

    我不相信你的

    [['21', '1'], ['21', '1'], ['21', '1'], ['21', '1'], ['22', '1'],...]
    

    line 可以由您提供的代码生成。您的 Subbasin_1.append 行将 list 附加到空列表 Subbasin_1,因此您应该得到类似

    [[['22', '1'], ['21', '1']]]
    

    多了一层嵌套。

    如果你避免不必要的空列表+追加构造,你应该得到你想要的:

    >>> Subbasins_Imp = [['22', '1'], ['21', '15'], ['11', '3'], ['31', '4'], ['41', '13'], ['21', '1']]
    >>> 
    >>> Subbasin_1 = [x for x in Subbasins_Imp if x[1] == '1']
    >>> print Subbasin_1
    [['22', '1'], ['21', '1']]
    >>> OS_Count1 = [x for x in Subbasin_1 if x[0] == '21']
    >>> print OS_Count1
    [['21', '1']]
    

    或者,您可以简单地用扩展替换附加。我不建议这样做,但它可能会帮助您了解正在发生的事情:

    >>> Subbasins_Imp = [['22', '1'], ['21', '15'], ['11', '3'], ['31', '4'], ['41', '13'], ['21', '1']]
    >>> 
    >>> Subbasin_1 = []
    >>> Subbasin_1.extend([x for x in Subbasins_Imp if x[1] == '1'])
    >>> print Subbasin_1
    [['22', '1'], ['21', '1']]
    >>> 
    >>> OS_Count1 = []
    >>> OS_Count1.extend([x for x in Subbasin_1 if x[0] == '21'])
    >>> print OS_Count1
    [['21', '1']]
    

    【讨论】:

    • 非常感谢!奇迹般有效。你是对的,我为 Subbasin_1 做的第一个附加是给了我一个三级深度列表。
    【解决方案2】:

    您的列表理解 [x for x in Subbasins_Imp if x[1] == '1'] 自己创建一个列表,这意味着当您将该列表附加到 Subbasin_1 时,您最终会得到一个双重嵌套列表。

    比较:

    sub_imp = [['22', '1'], ['21', '15'], ['11', '3'], ['31', '4'], ['41', '13']]
    sub_1 = [x for x in sub_imp if x[1] == '1']
    sub_2 = []
    sub_2.append([x for x in sub_imp if x[1] == '1'])
    
    print(sub_1)
    print(sub_2)
    

    【讨论】:

      【解决方案3】:

      运行你的代码我得到了一个三重嵌套列表....

      Sub = [[['21','1'],....]]
      

      而不是做:

        Subbasin_1 = []
        Subbasin_1.append([x for x in Sub if x[1]=='1'])
      

      简单的做列表理解:

      Subbasin_1 = [x for x in Sub if x[1] == '1']
      

      这将为您提供您期望的结果。

      【讨论】:

        【解决方案4】:

        没有区别,这意味着 Subbasin_1 在调用时可能为空或不包含您认为的数据。也可能是 Subbasin_1 嵌套了 3 层,而不是 2 层。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2019-07-07
          • 1970-01-01
          • 2016-02-08
          • 2023-03-30
          • 2022-11-17
          • 2016-02-12
          • 1970-01-01
          • 2021-11-25
          相关资源
          最近更新 更多