从一个创建两个列表以获取ID和数值

时间:2017-11-01 16:41:29

标签: python list

我有一个列表,例如以下

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:两个清单的订单需要相同。

3 个答案:

答案 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]有点暧昧,但未包含它。