【问题标题】:How to add one list's items to another list, one by one?如何将一个列表项逐个添加到另一个列表?
【发布时间】:2019-09-22 07:28:21
【问题描述】:

我有一个 csv 文件,其中一些内容如下所示:

name,x,y
N1,30.2356,12.5263
N2,30.2452,12.5300

...它继续。

这是我尝试过的,我从 .csv 中调用它们并分别添加到不同的列表中。

import csv

nn = []
xkoor = []
ykoor = []
coord = []
with open('C:/Users/Mert/Desktop/py/transformation/1.csv', 'r') as f:
    reader = csv.reader(f)
    for row in reader:
        nn.append(row[0].split(','))
        xkoor.append(row[1].split(','))
        ykoor.append(row[2].split(','))

j = 1
for i in range(len(xkoor)):
    for j in range(len(ykoor)):

我正在尝试将列表设置为:

coord = [30.2356,12.5263],[30.2452,12.5300],....

我不明白该怎么做。有什么想法吗?

【问题讨论】:

    标签: python list loops append extend


    【解决方案1】:

    默认情况下,csv-reader 应该用逗号为您拆分行:

    import csv
    
    with open('somefile.csv') as fh:
        reader = csv.reader(fh)
        for row in reader:
            print(row)
    
    # outputs
    ['name', 'x', 'y']
    ['N1', '30.2356', '12.5263']
    ['N2', '30.2452', '12.5300 ']
    

    考虑到这一点,如果您只是想遍历坐标,您可以使用解包来获取您的 xy,然后通过附加元组来构建您的列表:

    import csv
    
    coords = []
    
    with open('somefile.csv') as fh:
        reader = csv.reader(fh)
        next(reader) # skips the headers
        for row in reader:
            name, x, y = row
            coords.append((float(x), float(y)))
    
    # then you can iterate over that list like so
    for x, y in coords:
        # do something
    

    坐标将如下所示:

    [(30.2356, 12.5263), (30.2452, 12.53)]
    

    【讨论】:

      【解决方案2】:

      你不应该自己用逗号分割字符串,因为csv.reader 已经为你做了。只需遍历 csv.reader 生成器并根据需要解压缩列:

      reader = csv.reader(f)
      next(reader)
      coord = [[float(x), float(y)] for _, x, y in reader]
      

      【讨论】:

        【解决方案3】:

        好像你把事情复杂化了。

        如果您要做的只是创建一个仅包含 X 和 Y 值的坐标数组,那么您可以这样做:

        import csv
        coord = []
        with open('C:/Users/Mert/Desktop/py/transformation/1.csv', 'r') as f:
            reader = csv.reader(f)
            for row in reader:
                rowlist = row.split(',')
                coord.append(rowlist[1:3])
        print(coord)
        

        您需要做的就是在每行的基础上提取一个子集,并将其附加到您的坐标数组中。无需每次调用​​行拆分,或为您的轴创建单独的数组。

        亲亲!

        (另外,提个建议 - 让 PII 远离您的问题。无需使用整个 Windows 文件路径,只需指明它是 CSV 文件即可。我不需要知道您的姓名来回答问题! )

        【讨论】:

          【解决方案4】:

          为什么不用熊猫?!

          • read_csv 将准备好您的文件并转换为数据框
          • 迭代行并访问列 x 和 y
          • 组合成列表列表

          而且更容易使用

              import pandas as pd
              df = pd.read_csv('1.csv', header=0)
              [[r.x, r.y] for _, r in df.iterrows()]
          

          结果:

          [[30.2356, 12.5263], [30.2452, 12.53]]
          

          【讨论】:

            【解决方案5】:

            我会这样做:

            import csv
            
            # coordinates as strings 
            with open('some.csv', 'r') as f:
                cord = [a for _, *a in csv.reader(f)]
            
            # coordinates as floats
            with open('some.csv', 'r') as f:
                cord = [[float(x), float(y)] for _, x, y in csv.reader(f)]
            
            [print(xy) for xy in cord]
            

            【讨论】:

              【解决方案6】:

              如果你喜欢oneliners:

              data = """name,x,y
              N1,30.2356,12.5263
              N2,30.2452,12.5300"""
              
              coords = [[x,y]
                        for line in data.split("\n")[1:]
                        for _,x,y in [line.split(",")]]
              print(coords)
              

              这会产生

              [['30.2356', '12.5263'], ['30.2452', '12.5300']]
              

              【讨论】:

                猜你喜欢
                • 2021-08-18
                • 2020-01-23
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多