【问题标题】:Appending a list built using conditional and appended values to a list of lists将使用条件和附加值构建的列表附加到列表列表
【发布时间】:2017-11-11 21:24:34
【问题描述】:

我目前正在处理两个包含数值数据的大型 csv 文件。一种这样的 csv,我们称之为 X,完全由测试对象的数字数据组成。 a 的列排列为健康测量值,如下所示 (id, v1,v2,v3,v4)。我正在尝试获取这些信息并创建一个列表列表,其中每个列表都包含一个人的信息,即以这种方式:

X=[['1','a','b','c','d'],
   ['1','e','f','g','h'],
   ['2','i','j','k','l'],
   ['3','m','n','o','p']]

listoflists=[ [['1','a','b','c','d'],['1','e','f','g','h']],  #first row
              ['2','i','j','k','l'],   #second
              ['3','m','n','o','p'] ]  #third

(如果我应该编辑格式,请告诉我:我想将 X 显示为列以提高可读性。在列表列表中,我刚刚用完了空间,所以 listolists = [ a,b,c],其中 a 是第一行,b是第二行,c是第三行 我已经尝试了一些效果,但我最大的问题是我不确定在哪里创建具有匹配数据的实体列表,然后将其附加到“主列表”。

#create a set that holds the values of the subject ids.
    ids=list(set([item[0] for item in X]))
    #create the list of lists i want 
    listolists=[]
    for value in ids: 
        listolists.append(sublist)
        for i in range(len(X))
            sublist=[]           #I'm not sure where to create sublists of 
                                  #matching data and append to listolists
            if value == X[i][0]
               sublist.append(X[i]

感谢所有帮助。谢谢。

【问题讨论】:

  • IDs 是否保证是连续的 - 如果是 - 你可以使用 itertools.groupby - 如果不是 - 你可以使用 collections.defaultdict...
  • 感谢您的回复!他们就是这种情况!我一直在寻找一种更通用的方法来解决数据不太好的情况。
  • 不太清楚你所说的“一般方式”是什么意思 - [list(g) for k, g in itertools.groupby(X, lambda L: L[0])] 应该可以吗?
  • 对于 Python 中 CSV 文件的任何此类工作,您应该查看 pandas - 相同的 groupby(column_name) 存在那里,但它使处理数据更加容易
  • 我的错。我的意思是以防万一我“排序”的 id 或任何变量不是连续的,或者如果我想根据除相等性以外的其他条件构建一个列表。

标签: list python-3.x csv iteration


【解决方案1】:

这里有一些东西:

X =[
    ['1','a','b','c','d'],
    ['1','e','f','g','h'],
    ['2','i','j','k','l'],
    ['3','m','n','o','p'],
    ]

numbers = {x[0] for x in X}

output = []

for num in sorted(numbers):
    new_list = [sub_list for sub_list in X if sub_list[0] == num]
    output.append(new_list)

print(output)

...


[[['1', 'a', 'b', 'c', 'd'], ['1', 'e', 'f', 'g', 'h']],
 [['2', 'i', 'j', 'k', 'l']],
 [['3', 'm', 'n', 'o', 'p']]]

如果您需要第二个和第三个列表不像第一个那样嵌套,请告诉我

编辑 - 用于您问题中指定的确切格式

X =[
    ['1','a','b','c','d'],
    ['1','e','f','g','h'],
    ['2','i','j','k','l'],
    ['3','m','n','o','p'],
    ]

numbers = {x[0] for x in X}

output = []

for num in sorted(numbers):
    new_list = [sub_list for sub_list in X if sub_list[0] == num]
    if len(new_list) > 1:
        output.append(new_list)
    else:
        output.append((new_list)[0])

print(output)

【讨论】:

  • 没问题,如果您将其用于大量数据集,您可能希望更改理解以在数字发生变化时停止,因为此时它会进行完整迭代。如果您对它感到满意,请选择一个最佳答案。干杯
猜你喜欢
  • 2014-02-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-13
  • 1970-01-01
  • 2017-03-07
相关资源
最近更新 更多