Python将列表列拆分为原列表中的多列

1 投票
3 回答
3704 浏览
提问于 2025-04-17 19:34

我有一个列表,这个列表里面包含了很多子列表。下面是一些主列表中的子列表:

>>> data[4]
['', u'BNE JCT TR92 FLO GRJCT-PERRY-BITTERSWEET', u'BNE_JCT TR92 TR92 (XF/ALTW/*)', u'KARMA-PERRY-BITTERSWEET_161', u' 01', -15.88, '']
>>> data[5]
['', u'CRETE-STJHN FLO DMNT-WLTN 765+SPS', u'ST_JOHN 34519 A (LN/NIPS/CE)', u'SPS WILTON-DUMONT+PWRTN 5+JOLIET 7', u' 01', -8.14, '']
>>> data[6]
['', u'HRNR_TR_1_TR_1_XF', u'HRNR TR_1 TR_1 (XF/AMMO/*)', '', u' 01', 1.4, '']
>>> data[7]
['', u'INDPDN  INDPDBRYAN69_11 LN', u'INDPDN INDPDBRYAN69_1 1 (LN/ALTW/ALTW)', u'ACTUAL', u' 01', 1.26, '']
>>>

我想把子列表中的第三列拆分成4个部分,具体如下:

  • 从第一个字符到最后一个非空格字符的所有字符串
  • (/之间的字符串
  • //之间的字符串
  • /)之间的字符串

所以我想要的还是同一个列表,只不过第三列被拆分成了上面描述的4列。

举个例子:

['', u'BNE JCT TR92 FLO GRJCT-PERRY-BITTERSWEET', u'BNE_JCT TR92 TR92', u'XF',u'ALTW','*', u'KARMA-PERRY-BITTERSWEET_161', u' 01', -15.88, '']

我也不太明白前面那个u代表什么。我试着用re.split()来处理这个问题,但一直没能成功,想保留原来的列表,同时把子列表的第三列拆分成4个额外的列。

谢谢大家的帮助。

[我做了一个编辑,把arraylist改成了list]**

3 个回答

0
import re
data = ['', u'BNE JCT TR92 FLO GRJCT-PERRY-BITTERSWEET', u'BNE_JCT TR92 TR92 (XF/ALTW/*)', u'KARMA-PERRY-BITTERSWEET_161', u' 01', -15.88, '']
_data =[]
tempStr = ""
for i in data:
    if re.match("(.+/.+/.+)", str(i)):
        for char in i:
            if (char != "(" and char != "/" and char != ")"):
                tempStr += char
            else:
                _data.append(tempStr)
                tempStr = ""
    else:
        _data.append(i)
print _data

这个脚本会产生这样的输出:

['', u'BNE JCT TR92 FLO GRJCT-PERRY-BITTERSWEET', u'BNE_JCT TR92 TR92 ', u'XF', u'ALTW', u'*', u'KARMA-PERRY-BITTERSWEET_161', u' 01', -15.88, '']
3

这里有一个正则表达式模式,可以匹配你想要的字符串部分:

pattern = r"(.+) \((.+)/(.+)/(.+)\)"

这可能是最简单的正则表达式,可以完成这个任务。

下面是如何使用它:

import re

for row in data:
    row[2:3] = re.match(pattern, row[2]).groups()

这里的内容有点多。外层循环比较简单易懂。内层部分有两个部分:

  1. re.match(pattern, row[2]).groups() 负责进行正则表达式匹配,并返回找到的值的元组(比如 ('BNE_JCT TR92 TR92', 'XF', 'ALTW', '*'))。
  2. 第二部分是切片赋值。row[slice] = some_sequence 会用 some_sequence 中的值替换指定的切片。如果序列中的值数量和切片中的数量不一样,列表的大小就会改变!在这个例子中,我们用正则表达式匹配到的四个值替换了一个单值切片(从索引2开始,到索引3之前)。

请注意,如果正则表达式没有匹配到你任何行中的值,这段代码会抛出异常。如果你的数据可能会“杂乱”,你应该添加一些额外的逻辑来检测这种情况,而不是让程序崩溃。

2

前面的 u 是表示unicode的意思,这样字符串就可以包含unicode字符。这种写法在Python 3.0之前的版本中使用(Python 3.0及以上版本默认就是unicode)。

关于你提到的分割,你可以这样做来把字符串分成你想要的列:

# search for parts you need in column 3
for subitem in re.findall("(.*?) \((.*?)\)", item[2]):
    temp_split = [subitem[0]]
    temp_split.extend(subitem[1].split("/"))

在列表中间是不能直接添加列的。
你可以这样创建一个新的列表:

for item_index in range(len(data)):
    item = data[item_index]

    for subitem in re.findall("(.*?) \((.*?)\)", item[2]):
        # part before the ( )
        temp_split = [subitem[0]]
        # part in the ( )
        temp_split.extend(subitem[1].split("/"))

    temp_item = item[:2]
    temp_item.extend(temp_split)
    temp_item.extend(item[3:])

    data[item_index] = temp_item

撰写回答