【问题标题】:Transpose list to rows of data将列表转置为数据行
【发布时间】:2014-03-19 11:36:18
【问题描述】:

我在这样的文件中有数据:

196465702|91017022|['95592022', '96094942', '100920382']|91048702

我将转换数据如下:

196465702|91017022|95592022|91048702
196465702|91017022|96094942|91048702
196465702|91017022|100920382|91048702

到目前为止,我一直在尝试写这篇文章。不确定这是否是一种准确和最佳的方法。此外,如果在第 4 列和第 5 列等中有一个列表,则为每一列循环并返回会变得很棘手。

import csv
with open('sample.out','r') as x:
  f = csv.reader(x,delimiter='|')
  for row in f:
    s = row[2].translate(None,"'")
    #print s.split(',')
    for t in s.split(','):
      print row[0]+'|'+row[1]+'|'+t.translate(None,"[None]")+'|'+row[3].translate(None,"None")

有没有更好的方法来写这个?此外,如果数据在几列中有 List,是否有更好的方法来识别和转置到行并与其余数据连接回来?

【问题讨论】:

    标签: python list python-2.7 delimited


    【解决方案1】:

    我会这样做

    data = "196465702|91017022|['95592022', '96094942', '100920382']|91048702"
    from ast import literal_eval
    first, second, third, last = data.split("|")
    third = literal_eval(third)
    for item in third:
        print "{}|{}|{}|{}".format(first, second, item, last)
    

    输出

    196465702|91017022|95592022|91048702
    196465702|91017022|96094942|91048702
    196465702|91017022|100920382|91048702
    

    【讨论】:

    • 感谢literal_eval。它非常直观且更加紧凑。此外,如果我要添加更多具有列表值的列,这样好吗? x="196465702|91017022|['95592022', '96094942', '100920382']|91048702|['x','y']" from ast import literal_eval a, b, c, d,e = x.split("|") c = literal_eval(c) e = literal_eval(e) for cc in c: for ee in e: print "{}|{}|{}|{}|{}".format(a,b,cc,d,ee)
    • 一个相关的问题:如果data 是一个列表怎么办。 a,b,c,d = t[0],t[1],t[2],t[3] c = literal_eval(c)这将无法解析
    • @user3327034 当它是一个列表时,你能展示一个data 的样本吗?
    • 这里是原始数据。我最初已转换为管道分隔的数据。 ['197056942', '91004902', ['104608942', '95134582'], '91967062']
    • @user3327034 这里data已经在Python可处理列表中,所以你可以直接跳过literal_eval这一步
    猜你喜欢
    • 2018-01-27
    • 2021-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-02
    • 2023-01-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多