【问题标题】:Python - Appending value to each sublist in list of listsPython - 将值附加到列表列表中的每个子列表
【发布时间】:2019-03-29 05:03:26
【问题描述】:

我有一些很长的数据集,我试图用 numpy 读取它们,并在每一行附加一个值,然后输出为 CSV。最终目标是从同一个文件中拆分多个测量值,因此我需要一些方法来标记每个测量值。我想出了这个:

def csv_test(data_file):
    data_nd = np.genfromtxt(str(data_file),
    delimiter=";",
    usecols=(-3, -2, -1),
    dtype=None)
    data = np.ndarray.tolist(data_nd)
    output = []
    sub_output = []
    sub1 = str(1)
    for i in data:
        sub_output.append(i)
        sub_output.extend(sub1)
    output.append(sub_output)
    print(output)
    x_val = 1
    x_string = str(x_val)
    filename_out = str("temp_" + x_string + ".csv")
    with open(filename_out, "w") as f:
        writer = csv.writer(f)
        for sublist in output:
            writer.writerows(sublist)

问题是我的输出是这样的:

[[[0.0, -0.051, -1.525651e-07], '1', ...

不喜欢

[[[0.0, -0.051, -1.525651e-07, '1'] ...

因此,在 CSV 写入步骤中,附加值会换行。如何让它附加到列表中的子列表?

样本数据:

0;0.000000;-0.050;-6.900140e-008
0;0.100000;-0.050;-6.843410e-008
0;0.200000;-0.050;-6.778820e-008
0;0.300000;-0.050;-6.654330e-008
0;0.400000;-0.050;-6.598800e-008
0;0.500000;-0.050;-6.497330e-008
0;0.600000;-0.050;-6.415210e-008
0;0.700000;-0.050;-6.349080e-008
0;0.800000;-0.050;-6.181810e-008
0;0.900000;-0.050;-6.148080e-008
0;1.000000;-0.050;-6.032090e-008

【问题讨论】:

    标签: python python-3.x numpy export-to-csv


    【解决方案1】:

    问题是您应该将str(1) 附加到i,而不是sub_output

    for i in data:
            sub_output.append(i + [sub1])
            # sub_output.extend(sub1) <-- you don't need this line.
    

    注意我们没有i.append(sub1),因为append() 方法返回None。您想要 i 的完整列表 + sub1 的单个项目 list 附加到您的 sub_output

    【讨论】:

    • 谢谢,我认为这很简单。我不确定您对返回 None 的方法是什么意思,但 i.append(sub1) 似乎给了我正确的结果。
    • i.append(sub1) 会将其直接附加到 i (被迭代的对象),但是当您执行 sub_output.append(i.append(sub1)) 时它将没有效果,因为 i.append() 评估为None,所以您实际上只是将一堆None 添加到sub_output 中。但是,如果您将 i.append() first and then sub_output.append(i), *then* you are actually appending the object i` 放入 sub_output 中,它现在具有增加的元素。
    【解决方案2】:

    几点说明:

    1)这里不要使用.extend,它会拆分一个多字符的字符串。

    2)data已经是副本了,可以直接使用,不需要新建输出

    3) 由于data 的元素是可变的,所以您需要做的就是就地更改它们,这就是.append 所做的。所以data = data_nd.tolist() 之后的代码可以读取:

    for sub_list, new_element in zip(data, stuff_to_append):
        sub_list.append(new_element)
    

    这将以您想要的方式修改data,然后您可以将data 写入文件。

    【讨论】:

    • 感谢您的提示。是的,我意识到必须有一种不那么复杂的方式来实现同样的事情。对于zip(data, stuff_to_append):stuff_to_append 部分是否需要另一个列表才能合并?
    • @anothersimonharris 是的,我认为您可能不想将相同的内容附加到每一行。 stuff_to_append 是一个列表、元组或数组,甚至是一个生成器,每一行都有一个元素。顺便提一句。还有numpy添加列的方式,最短的是data_nd_plus_column = np.c_[data_nd, stuff_to_append]
    猜你喜欢
    • 2012-12-20
    • 2014-02-14
    • 1970-01-01
    • 2021-11-13
    • 1970-01-01
    • 1970-01-01
    • 2017-12-18
    • 2013-06-18
    • 2021-07-12
    相关资源
    最近更新 更多