输入:
我有一个文件,每个换行符中有数千个相同长度的字符串(上面列出的5个字符)。 以下是该文件中每个字符串的属性
目标/期望输出:
例如:输入/输出
Input
abc**M**1
abc**L**1
aef**L**2
aef**K**3
Output
M L K
abcM1 abcL1 -
- aefL2 -
- - aefK3
我被建议使用" groupby"函数来自itertools,它有助于根据" 4th"对字符串进行分组。字符。但我不确定如何以上面输出中给出的所需格式打印这些列表。
答案 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)
这可能不是最短的答案,但它应该相当容易阅读。
主要目标是建立条目的二维地图:
以下是示例,您可以根据需要更新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