【问题标题】:creating a list with a list as values创建一个以列表为值的列表
【发布时间】:2017-10-11 01:15:45
【问题描述】:

我有一个小问题。我正在尝试创建一个包含两列(ID 和坐标)的 csv,其中坐标列实际上是 4 个坐标的列表。这是我的代码:

North = 42.02
South = 32.40
West = -124.453125
East = -114.0985107421875

difference = (North-South)
divided = 10

splitsize = difference/divided

coordinates = []
ID = []

count = 0

while count < 10:
    coordinates.append([West, South+(splitsize*(count+1)), East, South+(splitsize*(count))])
    ID.append(count+1)
    count += 1

现在我想将两个列表合二为一,所以当我导出它时,我有一个包含两列的 CSV。第一个是 ID,第二个是坐标。

1,[-124.453125, 33.362, -114.0985107421875, 32.4]
2,[-124.453125, 34.324, -114.0985107421875, 33.362]

按照我一直以来的做法,我一直将所有内容放在一行中,并将 ID 和坐标放在一个单元格中。

编辑 只是想澄清我在寻找什么: end result

EDIT2:解决方案 这就是我最终从Writing Python lists to columns in csv 做的事情

with open('test.csv', 'wb') as f:
   writer = csv.writer(f)
   rows = zip(ID, coordinates)
   for row in rows:
       writer.writerow(row)

【问题讨论】:

  • 你应该重命名你的常量NORTHSOUTH等。标题大小写是为Python中的类名保留的
  • 你应该考虑使用JSON,你不想将数据结构放入你的csvs
  • 另外,不要使用while循环:for count in range(10) 更容易
  • 用独特的东西分隔列表...在 NLP 中,我们倾向于使用 |,因此列表列表 [[a,b,c], [d,e,f], ...] 可能为每个子列表中的每个元素用逗号分隔,并为每个元素用竖线分隔子列表...a,b,c|d,e,f|....
  • erip,我将如何进行管道分隔?

标签: python list csv indexing


【解决方案1】:

我不确定这是否适合您的情况,但默认情况下 csv 会返回与此类似的内容,因为它是一个逗号分隔的文件。尝试在 Excel 中打开文档并执行以下操作:

1) 选择数据列

2) 在数据、数据工具下,选择文本到列

3) 在打开的框中,选择“分隔”单选按钮,然后选择下一步

4) 选中“逗号”框并点击完成。

如果您的数据现在分两列,那么您所看到的只是因为它是一个 csv 文件。

【讨论】:

  • 感谢威廉的回复。这样做的问题是坐标被分割了,因为它们之间有逗号。
  • 我明白这一点,但我想我的意思是这两列并没有真正合并成一列。它只是这样显示,因为您将其保存为 .csv 文件。如果您要将其输出为 .xlsx 文件,它是否仍会在一列中?
  • 是的:\
【解决方案2】:

现在我想把两个列表合二为一,所以当我导出它时,我有一个 CSV 有两列。第一个是 ID,第二个是坐标。

1,[-124.453125, 33.362, -114.0985107421875, 32.4] 2,[-124.453125, 34.324, -114.0985107421875, 33.362]

方括号不是 csv 语法的一部分,因此将被导入为

"1","[-124.453125", "33.362", "-114.0985107421875", "32.4]"

如果您控制此 csv 的使用者,最简单的解决方案是仅导出五个值并让使用者处理列。 如果你需要一个层次结构,JSON 可能是一个更好的选择。

如果您的消费者希望将列表作为第二列并且无法处理 JSON (???),那么您需要导出类似

的内容
1,"[-124.453125, 33.362, -114.0985107421875, 32.4] 2,[-124.453125,
34.324, -114.0985107421875, 33.362]"

然后希望消费者做一个eval 或类似的东西来把它变成一个列表。请注意,这是一个非常糟糕的主意,因为eval 使用用户权限执行任意代码,因此任何天真的实现(以及最聪明的实现)都将成为很好的攻击向量。

【讨论】:

    【解决方案3】:
    North = 42.02
    South = 32.40
    West = -124.453125
    East = -114.0985107421875
    
    difference = (North-South)
    divided = 10
    
    splitsize = difference/divided
    
    my_list=[]
    count = 1
    
    while count < 10:
        coordinates = []
        coordinates.extend([West, South+(splitsize*(count+1)), East, South+(splitsize*(count))])
        ID=count
        my_list.append([ID,coordinates])
        count += 1
    

    【讨论】:

      猜你喜欢
      • 2020-10-22
      • 2017-12-03
      • 2022-12-12
      • 2018-06-20
      • 1970-01-01
      • 1970-01-01
      • 2015-12-02
      • 2014-06-29
      • 2022-01-18
      相关资源
      最近更新 更多