Python查找并替换lis中的最后一次出现

2024-05-19 15:20:32 发布

您现在位置:Python中文网/ 问答频道 /正文

在Python中,我有一个列表

list3 = ['PA0', 'PA1']
list2 = ['PB0', 'PB1']
list1 = ['PC0', 'PC1', 'PC2']

[(list1[i], list2[j], list3[k]) for i in xrange(len(list1)) for j in xrange(len(list2)) for k in xrange(len(list3))]

#Result
[('PC0', 'PB0', 'PA0'), 
('PC0', 'PB0', 'PA1'), 
('PC0', 'PB1', 'PA0'), 
('PC0', 'PB1', 'PA1'), 
('PC1', 'PB0', 'PA0'), 
('PC1', 'PB0', 'PA1'), 
('PC1', 'PB1', 'PA0'), 
('PC1', 'PB1', 'PA1'), 
('PC2', 'PB0', 'PA0'), 
('PC2', 'PB0', 'PA1'), 
('PC2', 'PB1', 'PA0'), 
('PC2', 'PB1', 'PA1')]

我如何找到最后一次出现并添加E作为后缀

[('PC0', 'PB0', 'PA0'), 
 ('PC0', 'PB0', 'PA1'), 
 ('PC0', 'PB1', 'PA0'), 
 ('PC0E', 'PB1', 'PA1'), 
 ('PC1', 'PB0', 'PA0'), 
 ('PC1', 'PB0', 'PA1'), 
 ('PC1', 'PB1', 'PA0'), 
 ('PC1E', 'PB1', 'PA1'), 
 ('PC2', 'PB0', 'PA0'), 
 ('PC2', 'PB0E', 'PA1'), 
 ('PC2', 'PB1', 'PA0E'), 
 ('PC2E', 'PB1E', 'PA1E')]

Tags: in列表forlenlist2xrangelist1pc1
3条回答

另一种方法是不断地添加索引,这样就可以得到最后一次出现的索引,itertools.产品还将为您创建初始列表:

from itertools import product

def last_inds(prod):
    # the key/value will be overwritten so we always keep the last seen
    return {ele: (i1, i2) for i1, prod in enumerate(prod) for i2, ele in enumerate(prod)}

prod = list(product(*(list1, list2, list3)))

# use the indexes to change the last occurrences.
for r, c in last_inds(prod).values():
    lst = list(prod[r])
    lst[c] += "E"
    prod[r] = tuple(lst)

从而得到预期的输出:

[('PC0', 'PB0', 'PA0'),
 ('PC0', 'PB0', 'PA1'),
 ('PC0', 'PB1', 'PA0'),
 ('PC0E', 'PB1', 'PA1'),
 ('PC1', 'PB0', 'PA0'),
 ('PC1', 'PB0', 'PA1'),
 ('PC1', 'PB1', 'PA0'),
 ('PC1E', 'PB1', 'PA1'),
 ('PC2', 'PB0', 'PA0'),
 ('PC2', 'PB0E', 'PA1'),
 ('PC2', 'PB1', 'PA0E'),
 ('PC2E', 'PB1E', 'PA1E')]

根据我的时间安排,这是使用数据的最快方法。你知道吗

In [37]: %%timeit
prod = list(product(*(list1, list2, list3)))
m(prod)
   ....: 
10000 loops, best of 3: 20.7 µs per loop

In [38]: %%timeit
prod = list(product(*(list1, list2, list3)))
for r, c in last_inds(prod).values():
    lst = list(prod[r])
    lst[c] += "E"
    prod[r] = tuple(lst)
   ....: 

100000 loops, best of 3: 12.2 µs per loop

其中m是:

def m(inputlist):
    seensets = [set() for _ in inputlist[0]]
    outputlist = []
    for entry in reversed(inputlist):
        newentry = []
        for value, seen in zip(entry, seensets):
            newentry.append(value + 'E' if value not in seen else value)
            seen.add(value)
        outputlist.append(tuple(newentry))
    outputlist.reverse()

如果您不是在这里寻找闪电速度,您可以执行以下操作:

  1. 使用https://stackoverflow.com/a/952952/2988730展平列表
  2. 找到独特的元素
  3. 查找每个唯一元素最后一次出现的索引(通过反转列表)
  4. 更新元素
  5. 使用https://stackoverflow.com/a/10124783/2988730重新调整扁平列表的形状

下面是一个示例实现:

# 1
flat = list(reversed([x for group in mylist for x in group]))
# 2
uniq = set(flat)
# 3, 4
for x in uniq:
    flat[flat.index(x)] += 'E'
# 5
mylist = list(zip(*[reversed(flat)]*3))

结果:

[('PC0', 'PB0', 'PA0'),
 ('PC0', 'PB0', 'PA1'),
 ('PC0', 'PB1', 'PA0'),
 ('PC0E', 'PB1', 'PA1'),
 ('PC1', 'PB0', 'PA0'),
 ('PC1', 'PB0', 'PA1'),
 ('PC1', 'PB1', 'PA0'),
 ('PC1E', 'PB1', 'PA1'),
 ('PC2', 'PB0', 'PA0'),
 ('PC2', 'PB0E', 'PA1'),
 ('PC2', 'PB1', 'PA0E'),
 ('PC2E', 'PB1E', 'PA1E')]

以相反的方式处理输入列表,然后首先标记出现的任何值。可以使用集合列表来跟踪已经看到的值。完成后反转生成的输出列表:

seensets = [set() for _ in inputlist[0]]
outputlist = []
for entry in reversed(inputlist):
    newentry = []
    for value, seen in zip(entry, seensets):
        newentry.append(value + 'E' if value not in seen else value)
        seen.add(value)
    outputlist.append(tuple(newentry))
outputlist.reverse()

演示:

>>> seensets = [set() for _ in inputlist[0]]
>>> outputlist = []
>>> for entry in reversed(inputlist):
...     newentry = []
...     for value, seen in zip(entry, seensets):
...         newentry.append(value + 'E' if value not in seen else value)
...         seen.add(value)
...     outputlist.append(tuple(newentry))
...
>>> outputlist.reverse()
>>> pprint(outputlist)
[('PC0', 'PB0', 'PA0'),
 ('PC0', 'PB0', 'PA1'),
 ('PC0', 'PB1', 'PA0'),
 ('PC0E', 'PB1', 'PA1'),
 ('PC1', 'PB0', 'PA0'),
 ('PC1', 'PB0', 'PA1'),
 ('PC1', 'PB1', 'PA0'),
 ('PC1E', 'PB1', 'PA1'),
 ('PC2', 'PB0', 'PA0'),
 ('PC2', 'PB0E', 'PA1'),
 ('PC2', 'PB1', 'PA0E'),
 ('PC2E', 'PB1E', 'PA1E')]

相关问题 更多 >