繁体   English   中英

如何相对于其他列表更改列表中的值?

[英]How to change values in a list with respect to other list?

我有 2 个列表:

Example 1:-

a=['AA','AA','AA','AA','BB','BB','BB','BB','CC','CC','CC','CC','CC']
c = ['xyz', 'xyz', 'yy', 'xyz', 'zz', 'zy', 'zy', 'zy', 'll', 'll', 'll', 'lz', 'lz']

Example 2:-

a=['AA','AA','AA','AA','AA','AA','AA','AA','AA','BB','BB','BB','BB','CC','CC','CC','CC','CC']
c = ['','','','','','xyz', 'xyz', 'yy', 'xyz', 'zz', 'zy', 'zy', 'zy', 'll', 'll', 'll', 'lz', 'lz']

所以在这两个列表中,

对于列表 a,对于那些相同的重复值的索引,在 AA、BB 和 CC 组中重复的值我想更改列表 c 中的值。

在列表 c 中,我想根据 AA、BB、CC 组的索引更改值,以使重复最大次数的任何一个值都用重复的值替换该组 AA、BB、CC 索引中的其他值最大次数。

Expected output of list c in example 1:- 

c=['xyz','xyz','xyz','xyz','zy','zy','zy','zy','ll','ll','ll','ll','ll']

Expected output of list c in example 2:-
c = ['','','','','','xyz', 'xyz', 'xyz', 'xyz', 'zy', 'zy', 'zy', 'zy', 'll', 'll', 'll', 'll', 'll']




因为 AA 重复了四次,所以我们检查了列表 C 中的前 4 个值,并替换了所有重复次数最多的值。 BB 和 CC 也一样。

在示例 2 中:我想保持空字符串 '' 原样,其余逻辑应与示例 1 相同。空字符串在输入中重复四次 '' 在预期的 output 和 rest 逻辑中应保持相同,其余逻辑应相同非空字符串值。

带有zip a itertools.groupby c . 使用collections.Counter最频繁的值。

from itertools import groupby
from collections import Counter

a = ['AA', 'AA', 'AA', 'AA', 'BB', 'BB', 'BB', 'BB', 'CC', 'CC', 'CC', 'CC', 'CC']
c = ['xyz', 'xyz', 'yy', 'xyz', 'zz', 'zy', 'zy', 'zy', 'll', 'll', 'll', 'lz', 'lz']

c_new = []

# zip a and c and group by a_i
for _, group in groupby(zip(a, c), key=lambda x:x[0]):

    # get the c values from the resulting [(a_i, c_i)] list
    c_elems = [x[1] for x in group]

    # count them, excluding ''
    counts = Counter(x for x in c_elems if x)
    
    # get the maximum
    c_max = max(counts, key=counts.get)
    
    # append '' or max_elem once for every element in the group
    for c_elem in c_elems:
        c_new.append(c_max if c_elem else c_elem)

一个非常原始和幼稚但易于说明的解决方案:

>>> a=['AA','AA','AA','AA','BB','BB','BB','BB','CC','CC','CC','CC','CC']
>>> c=['xyz','xyz','xyz','xyz','zy','zy','zy','zy','ll','ll','ll','ll','ll']

>>> counts = [a.count(i) for i in a]
[4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5]

>>> combined = list(zip(c, counts))
[('xyz', 4), ('xyz', 4), ('xyz', 4), ('xyz', 4), ('zy', 4), ('zy', 4), ('zy', 4), ('zy', 4), ('ll', 5), ('ll', 5), ('ll', 5), ('ll', 5), ('ll', 5)]

>>> d = sorted(combined, key=lambda i: i[1])
[('xyz', 4), ('xyz', 4), ('xyz', 4), ('xyz', 4), ('zy', 4), ('zy', 4), ('zy', 4), ('zy', 4), ('ll', 5), ('ll', 5), ('ll', 5), ('ll', 5), ('ll', 5)]

>>> e = [i[0] for i in d]
['xyz', 'xyz', 'xyz', 'xyz', 'zy', 'zy', 'zy', 'zy', 'll', 'll', 'll', 'll', 'll']

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM