簡體   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