Python:将字符串/浮点数合并和格式化写入cs中

2024-06-14 11:08:57 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个变量compareout,它存储嵌套的数据列表:

compareout = [...
[Guyana,951.723423,1037.123424,28.476757,2.991234],
[Bolivia,936.123420,1065.8234236,43.25123,4.62],
[Philippines,925.52342342,1119.62342341,64.70234234,6.991234123],
[Congo (Rep.),907.22342343,1657.52342349,250.1242342,27.571234123],
...]

我想:

  1. 按第二列升序排序,将此排序列表的前10项写入.csv
  2. 按第二列降序排序,将前10项排序列表写入第二个.csv

但是,我需要格式化输出,使所有的浮点值都只有2位小数,并在第二列和第三列值的前面加上一个“%”符号。虽然我可以迭代“compareout”并替换最后两个列,就像这样。。。在

^{pr2}$

我不能做一些简单的事情,比如:

for line in ascending:
    line[1] = "USD %.2f" % line[1]
    line[2] = "USD %.2f" % line[2]

因为这不允许排序。目前,在我第一次排序并将数据写入第一个文件后,我就有了上面的代码,但是我当然不能按降序排序…我也很困惑如何指定只写10个项目。。。在

我在谷歌上搜索了大约一个小时,似乎找不到足够的信息来确定csv.writerow()函数允许在写作时格式化,我已经用尽办法了。如果有人能给我一些想法,我将非常感激。。。在


Tags: csv数据列表排序line浮点usd升序
2条回答

考虑创建两个不同的列表对象;对它们进行相应的排序,然后分别将每行writerow()放入csv文件中

按列排序(例如,按1.0项排序)运算符.itemgetter()

尝试在上面的sorted()函数中添加reverse=True进行降序排序

因为您只想为每个输出文件writerow()10个项,请检查csvreader.line_号或者使用csvreader循环。next()

您可以编写一个format函数,从列表中获取一个项并返回格式化的行。比如:

def format_row(row):
    result = row[:]   #make a copy of the row
    # format should be preferred over %.
    # Also, you don't have to escape the %.
    result[1] = "USD {:.2f}".format(result[1])
    result[2] = "USD {:.2f}".format(result[2])
    # do whatever else you have to do for a single row
    return result

之后,您可以:

^{pr2}$

请注意,在compareout列表上调用两次sorted将花费两倍的时间,而使用sorted_values[-10:][::-1]需要固定的时间,因此效率更高。如果您还想使用两种类型,我建议您执行以下操作:

sorted_values = sorted(the_values, key=lambda x: x[1])   #sort by second column
# ...
#use sorted_values, instead of the_values
sorted_values.sort(key=lambda x: x[1], reverse=True)
# ...

例如,对已经排序的值调用.sort。当处理部分排序的数据时,列表的排序算法非常聪明,因此上面的代码将对第一个排序使用O(nlogn),而第二个代码只使用O(n)

>>> import random
>>> L = [random.randint(0, 1000) for _ in range(10000)]
>>> import timeit
>>> timeit.timeit('sorted(L)', 'from __main__ import L', number=100)
0.2509651184082031
>>> timeit.timeit('sorted(L)', 'from __main__ import L', number=100)
0.2547318935394287
>>> L.sort()
>>> timeit.timeit('sorted(L, reverse=True)', 'from __main__ import L', number=100)
0.11794304847717285
>>> timeit.timeit('sorted(L, reverse=True)', 'from __main__ import L', number=100)
0.11488604545593262

(在这个简单的例子中,您可以使用reversed(L),但在其他情况下这是不可能的)。在

相关问题 更多 >