基于第n个字符

时间:2017-02-06 12:47:53

标签: python python-2.7

输入:

我有一个文件,每个换行符中有数千个相同长度的字符串(上面列出的5个字符)。 以下是该文件中每个字符串的属性

  • 所有字符串长度相同 - 5个字符。
  • 字符串的前3个字符可以被称为" pattern" (即上例中的abc,aef)。
  • 每个字符串的第4个字符称为"版本"。它只能有3个可能的值 - M / L / K(如上所述)。 最后一个字符是"唯一ID"该字符串表示为数字(它可以具有值1,2,3)。

目标/期望输出:

  • 将该文件中的字符串条目写入由"版本"分组的单独列中。 (即,L / M / K - 字符串的第4个字符)。
  • 在每一列下,字符串应根据" pattern"进行分组。 (即,字符串的前3个字符)并且应按照"唯一ID"的升序排列。 for" pattern" (例如,上述输出中的第二列L)。
  • 常见的"唯一ID"对于多个"版本"的特定家庭应排列在同一行(例如,上述输出中的第一个条目)。但是,如果没有相同的"唯一ID"对于给定的变体,它应标记为" - "。

例如:输入/输出

Input

abc**M**1
abc**L**1
aef**L**2
aef**K**3

Output

   M        L         K
  abcM1    abcL1       -
    -      aefL2       -
    -        -       aefK3

我被建议使用" groupby"函数来自itertools,它有助于根据" 4th"对字符串进行分组。字符。但我不确定如何以上面输出中给出的所需格式打印这些列表。

2 个答案:

答案 0 :(得分:0)

您必须首先使用sorted函数根据第5个索引对列表进行排序,然后您必须根据第5个索引调用itertools.groupby(使用operator.itemgetter来实现此目的) 。例如:

<div class="div_class">
  <h3>Normal</h3>
  <h3 class="special_class">Special</h3>
  <h3>Normal</h3>
</div>

根据问题中提到的示例,您的列表似乎已经排序。如果是这种情况,您可以跳过排序部分。

现在你有每组的篮子。为了用空>>> from operator import itemgetter >>> from itertools import groupby >>> my_list = ['abc**M**1', 'abc**L**1', 'aef**L**2', 'aef**K**3', 'xyz**M**3'] >>> [[i.replace('*', '') for i in j] for _, j in groupby(sorted(my_list, key=itemgetter(5)), key=itemgetter(5))] [['aefK3'], ['abcL1', 'aefL2'], ['abcM1', 'xyzM3']] # ^ ^ ^ # K-Group L-Group M-Group 填充它。您可以创建一个for循环:

-

# same value extracted from above code group_basket = [['aefK3'], ['abcL1', 'aefL2'], ['abcM1', 'xyzM3']] depth = 3 for b in group_basket: for i in range(depth): if i >= len(b) or not b[i].endswith(str(i+1)): b.insert(i, '-') 保留的最终值为:

group_basket

您可以使用>>> group_basket [['-', '-', 'aefK3'], ['abcL1', 'aefL2', '-'], ['abcM1', '-', 'xyzM3']] as:

以所需格式打印数据
zip

答案 1 :(得分:0)

这可能不是最短的答案,但它应该相当容易阅读。

主要目标是建立条目的二维地图:

  1. 等级1键格式(&#39; abc&#39;,1)
  2. 第2级[&#39; M&#39;,&#39; L&#39;,&#39; K&#39;]
  3. 以下是示例,您可以根据需要更新print_entries

    inputs = ['abcM1', 'abcL1', 'aefL2', 'aefK3']
    
    def parse_inputs(inputs):
        entries = dict()    # key (abc,1), key ['M', 'L', 'K']
    
        for input_string in inputs:
            # parse and break down
            version = input_string[3]
            unique_id = int(input_string[4])
            key = (input_string[:3], unique_id)
    
            # put in ditionary
            if key not in entries:
                entries[key] = dict()
            entries[key][version] = input_string
        return entries
    
    def print_entries(entries):
        ids = ['M', 'L', 'K']
        print '{:^6} {:^6} {:^6}'.format(*ids)
        for key in sorted(entries.keys()):
            cur_entries = entries[key]
            # for each id, find the entry, if not found, use placeholder '_'
            outputs = [cur_entries[_id] if _id in cur_entries else '_' for _id in ids]
            print '{:^6} {:^6} {:^6}'.format(*outputs)
    
    entries = parse_inputs(inputs)
    print_entries(entries)
    

    输出是:

      M      L      K   
    abcM1  abcL1    _   
      _    aefL2    _   
      _      _    aefK3