我有一个列表,例如以下
Final_list = ['A', 'B', 'C', 'D', 'E', 'B_-1', 'C_-1', 'D_-1']
我想创建两个列表来获取ID,然后获取数值。 要做到这一点,我在“_”后拆分以分割;
j = []
for i in Final_list:
timelags = i.split("_")
j.append(timelags)
print(j)
,结果是
List_2 = [['A'], ['B'], ['C'], ['D'], ['E'], ['B', '-1'], ['C', '-1'], ['D', '-1']]
但我想创建两个列表,例如见下文;
ID = ['A','B','C','D','E']
Timelag = [[0],[-1,0],[-1,0],[-1,0],[0]]
你可以看到ID列表中没有重复项,如果没有_就是原始列表,则Timelag列表中有0。为A和E. P.S:两个清单的订单需要相同。
答案 0 :(得分:1)
如果每个列表中的项目必须相互对应,您可以将每个元素映射到一个值:
Final_list = ['A', 'B', 'C', 'D', 'E', 'B_-1', 'C_-1', 'D_-1']
mapping = {}
for elt in Final_list:
if len(elt) == 1:
mapping[elt] = [0]
else:
mapping[elt[0]] = [int(elt[2:])] + mapping[elt[0]]
mapping
{'A': [0], 'B': [-1, 0], 'C': [-1, 0], 'D': [-1, 0], 'E': [0]}
它不保留元素的顺序,但元素的配对及其值保持不变。
如果列表很重要,可以提取它们 - 它们保持配对,但不是顺序:
list(mapping.keys()), list(mapping.values())
(['A', 'B', 'C', 'D', 'E'], [[0], [-1, 0], [-1, 0], [-1, 0], [0]])
此外,有序字典可用于维护配对和列表顺序,具体取决于它对您的用例的重要性。
警告:输入数据的标记化相当粗糙,并假设数据的长度和值受到约束。可根据您的需要添加改进。
答案 1 :(得分:1)
使用groupby
解决方案
from itertools import groupby
l = [list(g) for k, g in groupby(sorted(Final_list),lambda x:x[0])]
d = [(i[0], [i[1].split('_')[1],0] if len(i)==2 else [0]) for i in l]
list(zip(*d))
输出:
[('A', 'B', 'C', 'D', 'E'), ([0], ['-1', 0], ['-1', 0], ['-1', 0], [0])]
答案 2 :(得分:0)
由于订单要保留,请使用OrderedDict
。存储key
,然后将timestamp
存储在其中,并使用它来构建列表。
>>> from collections import OrderedDict
>>> d = OrderedDict()
>>> for x in Final_list:
if len(x)<=1 :
d[x] = 0
else :
a, b = x.split('_')
d[a] = b
>>> d
=> OrderedDict([('A', 0), ('B', '-1'), ('C', '-1'), ('D', '-1'), ('E', 0)])
#convert into the format OP wants
>>> [ [int(v)] for v in d.values() ]
=> [[0], [-1], [-1], [-1], [0]]
注意:,因为0
中的[-1,0]
有点暧昧,但未包含它。