代码之家  ›  专栏  ›  技术社区  ›  jester

从python 3中的列表中查找并提取模式化字符串

  •  0
  • jester  · 技术社区  · 6 年前

    我在python 3中有一个数据类型列表,如下所示。

    list1 = ['1128=9,9=639, 75=20140110,268=6,START,22=8,48=49798,83=63663,271=7,1020=7,5799=1,START,48=49798,83=63664,451=0,1003=2,5799=1','1128=9,9=6389, 75=20140119, START, 22=8,48=49798, 271=0.75,1020=7,5799=1,START,22=8,48=49798,83=63664,451=0,1020=10,5799=1,START,22=8,48=49798,271=63664,451=0,1020=10,5799=1']
    

    列表1的长度为2。

    我想首先提取所有有用的字符串并省略所有其他字符串。

    我想保留52=、start、75=、271=和451=的所有内容。

    那么期望的输出应该是:

    list2 = ['75=20140110, START,271=7,START,451=0','75=20140119, START, 271=0.75,START,451=0, START, 271=63664,451=0']
    

    最后一步是拆分列表并创建新列表。

    在每个元素中,我想将子字符串“75=……”粘贴到单词“start”后的子字符串中。

    所需的输出看起来像。

    list3 = ['75=20140110, START,271=7', '75=20140110,START,451=0','75=20140119, START, 271=0.75','75=20140119,START,451=0', '75=20140119,START, 271=63664,451=0']
    

    现在,它是5个元素的列表。我们在列表2中有2个子字符串开始,元素1,而在列表2中有3个子字符串开始,元素2。

    我是新来的巨蟒,非常感谢你的帮助。

    2 回复  |  直到 6 年前
        1
  •  1
  •   Om trivedi    6 年前

    这应该可以在列表理解的帮助下解决第一个问题。

     f = ['1128=9,9=639, 75=20140110,268=6,START,22=8,48=49798,83=63663,271=7,1020=7,5799=1,START,48=49798,83=63664,'
         '451=0,1003=2,5799=1',
         '1128=9,9=6389, 75=20140119, START, 22=8,48=49798, 271=0.75,1020=7,5799=1,START,22=8,48=49798,83=63664,'
         '451=0,1020=10,5799=1,START,22=8,48=49798,271=63664,451=0,1020=10,5799=1']
    
    def convert(li):
        text = ['52=', 'START', '75=', '271=', '451=']
        return [", ".join([y for y in x.split(',') for z in text if z in y]) for x in li]
    
    print(convert(f))
    #output [' 75=20140110, START, 271=7, START, 451=0', ' 75=20140119,  START,  271=0.75, START, 451=0, START, 271=63664, 451=0']
    
        2
  •  2
  •   Arda Arslan    6 年前

    这将解决您的第一个问题:

    (您没有指定用例是否对空格敏感,所以我忽略了它们)

    list1 = [
        '1128=9,9=639, 75=20140110,268=6,START,22=8,48=49798,83=63663,271=7,1020=7,5799=1,START,48=49798,83=63664,451=0,1003=2,5799=1','1128=9,9=6389, 75=20140119, START, 22=8,48=49798, 271=0.75,1020=7,5799=1,START,22=8,48=49798,83=63664,451=0,1020=10,5799=1,START,22=8,48=49798,271=63664,451=0,1020=10,5799=1'
    ]
    
    texts_to_keep = ['52=', 'START', '75=', '271=', '451=']
    
    # Split the list on commas to work with the data easier
    list1_split = [item.split(',') for item in list1]
    
    # Create a new list of the same length as your old list1
    list1_new = [[] for item in list1]
    for items, list1_list in zip(list1_split, list1_new):
        # Grab each string in the sub list
        for item in items:
            # Now check if your substrings are in the original string
            for text_to_keep in texts_to_keep:
                # If it is, keep it
                if text_to_keep in item:
                    list1_list.append(item)
    
    final_list1 = [
        ','.join(sub_list) for sub_list in list1_new
    ]
    

    其输出:

    [' 75=20140110,START,271=7,START,451=0', ' 75=20140119, START, 271=0.75,START,451=0,START,271=63664,451=0']
    

    应该可以通过对性能的列表理解来完成这项工作,但是它变得非常难看,所以我使用了上面的简单实现。

    根据你的第二个问题,据我所知,你有时会添加子字符串“75=…”,有时不会,我也看不出模式。