【问题标题】:Dealing with Missing Data within a String [closed]处理字符串中的缺失数据[关闭]
【发布时间】:2013-11-15 16:11:00
【问题描述】:

假设我有一个长字符串 S,它看起来像:

S = "A, 2001, 2003, 2005, A, 2002, A, 2003, 2004, 2005, 2006, A, 2001, 2002, A, 2001, 2006, 2004, A..." 

使用Python,如何获取以下字符串:

"A, 2001, 2003, 2005, , A, 2002, , , , A, 2003, 2004, 2005, 2006, A, 2001, 2002, , , A, 2001, 2006, 2004, , A..." 

我希望“列”(即逗号)的数量等于两个 As 之间出现的最大年数。

这里的动机是创建一个合理排序的 CSV 文件。

我想把它分解成一个列表,然后循环遍历,如果在这个例子中元素的长度小于 4,则给每个元素添加逗号。

【问题讨论】:

  • “列”是指逗号的数量吗?
  • 您的示例输入和所需输出似乎与描述不符,或者我读错了。
  • 你的意思是每个'A'之间应该有一个固定的年份,如果缺少一些年份,你想插入逗号吗?

标签: python string csv


【解决方案1】:

首先,将初始字符串拆分为元素,然后创建一个二维数组并计算最大长度。然后,您可以在添加丢失的单元格时将它们合并回来。比如:

S = "A, 2001, 2003, 2005, A, 2002, A, 2003, 2004, 2005, 2006, A, 2001, 2002, A, 2001, 2006, 2004"

elems = S.split(', ')
lines = []
line = []
length = 0
maxlength = 0
for elem in elems[1:]:
    if 'A' == elem:
        lines.append(line)
        line = []
        if length > maxlength:
            maxlength = length
        length = 0
    else:
        line.append(elem)
        length += 1
lines.append(line)

for line in lines:
    line.extend([''] * (maxlength - len(line)))
    line.insert(0, 'A')

print ','.join(map(lambda x : ','.join(x), lines))

【讨论】:

    【解决方案2】:

    由于我们不知道开始时的最大长度,因此如果没有临时存储空间,您将很难摆脱 2 个通道:

    s = "A, 2001, 2003, 2005, A, 2002, A, 2003, 2004, 2005, 2006, A, 2001, 2002, A, 2001, 2006, 2004, A..."
    parts = s.split('A,')
    parts.pop(0) # first is empty
    xlen  = max([len(x.split(',')) for x in parts])
    for x in parts:
      have  = x.count(',')
      print "A, " + x + (", " * (xl - have - 1))
    

    还有输出:

    A,  2001, 2003, 2005, , 
    A,  2002, , , , 
    A,  2003, 2004, 2005, 2006, 
    A,  2001, 2002, , , 
    A,  2001, 2006, 2004, A..., 
    

    【讨论】:

    • 哇。非常感谢!存在这个由如此慷慨的聪明人组成的社区,有时对人性的善良保持着动摇的信念。
    猜你喜欢
    • 2017-12-27
    • 2020-09-27
    • 1970-01-01
    • 2021-09-10
    • 2020-12-05
    • 1970-01-01
    • 1970-01-01
    • 2017-07-07
    • 1970-01-01
    相关资源
    最近更新 更多