验证一个列表中的一个列表是否与python中另一个列表的值匹配

2024-04-27 02:38:02 发布

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

我有一个列表(有成千上万的子列表)。 随着时间的推移,更多的列表被用户添加到大列表中。你知道吗

作为一个模拟的例子,我有一些类似的东西:

my_list_grouped_by_0 = 
    [['X00001', 1123477, 1.25, 'Yes', 'No', 11.53, 3.23, 0.25], 
     ['X00002', 1125251, 0.22, 'Yes', 'No', 22.83, 3.6, 0.5], 
     ['X00003', 1125433, 1.23, 'Yes', 'No', 1.86, 3.65, 0.15], 
     ['X00004', 1231254, 1.3, 'Yes', 'No', 21.83, 3.6, 0.5], 
     ['X00008', 2520250, 54.02, 'Yes', 'No', 1.83, 3.8, 0.01], 
     ['X00005', 3202020, 966.33, 'Yes', 'No', 1.8, 3.8, 0.36], 
     ['X00006', 3215204, 1.36, 'Yes', 'No', 1.86, 3.65, 0.15], 
     ['X00007', 4561230, 6.33, 'Yes', 'No', 1.83, 66.22, 0.1], 
     ['X00009', 5721365, 1.25, 'No', 'No', 11.53, 3.23, 0.25], 
     ['X00010', 8520025, 6.33, 'Yes', 'No', 1.83, 66.22, 0.1], 
     ['X00012', 8520123, 966.33, 'Yes', 'No', 1.8, 3.8, 0.36], 
     ['X00011', 9536122, 54.01, 'Yes', 'No', 1.83, 3.8, 0.01], 
     ['X00015', 1212021, 0.333, 'No', 'No', 1.83, 3.8, 0.01], 
     ['X00013', 9654123, 4.1, 'No', 'No', 1.83, 3.8, 0.01], 
     ['X00014', 2021230, 1.23, 'Yes', 'No', 1.86, 3.65, 0.15], 
     ['X00017', 3322123, 1.23, 'Yes', 'Yes', 1.88, 1.25, 1.12], 
     ['X00016', 9531450, 23.15, 'Yes', 'Yes', 1.83, 3.25, 0.12], 
     ['X00020', 3625252, 1.23, 'Yes', 'No', 1.86, 3.65, 0.15], 
     ['X00018', 1205203, 1.87, 'Yes', 'No', 1.88, 1.25, 1.12], 
     ['X00019', 1124521, 0.25, 'No', 'No', 2.1, 0.6, 0.03], 
     ['X00021', 8952631, 0.25, 'No', 'No', 2.4, 0.6, 0.03], 
     ['X00022', 1123458, 0.33, 'Yes', 'Yes', 10.38, 41.11, 0.5], 
     ['X00023', 3236254, 3, 'No', 'Yes', 10.38, 41.11, 0.5], 
     ['X00024', 1205323, 1.87, 'Yes', 'No', 1.88, 1.25, 1.12]] 

用户将添加新列表,例如:

['X00099', 1212021, 0.333, 'No', 'No', 1.83, 3.8, 0.01]

如果索引2、3、4、5、6、7处的值与现有列表列表中的一个列表匹配,我希望索引0处的值(在本例中为X00099)被原始列表中的值覆盖(在本例中为“X00015”,因为值匹配)。你知道吗

如果新列表与任何现有列表不匹配,我想添加下一个X00000值(在这种情况下,我将为新添加的列表分配X00025)。你知道吗

索引1处的值是每个列表唯一的Id,仅用于将信息覆盖回数据库,从而确认具有相应Id的列表与其他列表的值相同。你知道吗

我不知道如何将新添加的列表与原始列表中的列表进行比较,看是否匹配或是新的列表。你知道吗

但是,我可以使用groupby:

from itertools import groupby
from operator import itemgetter

得到这个:

>>> my_list_grouped_by = [list(g) for _, g in groupby(sorted(my_list), itemgetter(2, 3, 4, 5, 6, 7))]
>>> my_list_grouped_by
[[['X0000', 1123477, 1.25, 'Yes', 'No', 11.53, 3.23, 0.25]], 
[['X0000', 1125251, 0.22, 'Yes', 'No', 22.83, 3.6, 0.5]], 
[['X0000', 1125433, 1.23, 'Yes', 'No', 1.86, 3.65, 0.15]], 
[['X0000', 1231254, 1.3, 'Yes', 'No', 21.83, 3.6, 0.5]], 
[['X0000', 2520250, 54.02, 'Yes', 'No', 1.83, 3.8, 0.01]], 
[['X0000', 3202020, 966.33, 'Yes', 'No', 1.8, 3.8, 0.36]], 
[['X0000', 3215204, 1.36, 'Yes', 'No', 1.86, 3.65, 0.15]], 
[['X0000', 4561230, 6.33, 'Yes', 'No', 1.83, 66.22, 0.1], 
['X0000', 5252631, 6.33, 'Yes', 'No', 1.83, 66.22, 0.1]], 
[['X0000', 5721365, 1.25, 'No', 'No', 11.53, 3.23, 0.25], 
['X0000', 7721365, 1.25, 'No', 'No', 11.53, 3.23, 0.25]], 
[['X0000', 8520025, 6.33, 'Yes', 'No', 1.83, 66.22, 0.1]], 
[['X0000', 8520123, 966.33, 'Yes', 'No', 1.8, 3.8, 0.36]], 
[['X0000', 9536122, 54.01, 'Yes', 'No', 1.83, 3.8, 0.01]], 
[['X0010', 1212021, 0.333, 'No', 'No', 1.83, 3.8, 0.01]], 
[['X0010', 9654123, 4.1, 'No', 'No', 1.83, 3.8, 0.01]], 
[['X0020', 2021230, 1.23, 'Yes', 'No', 1.86, 3.65, 0.15]], 
[['X0070', 3322123, 1.23, 'Yes', 'Yes', 1.88, 1.25, 1.12]], 
[['X0070', 9531450, 23.15, 'Yes', 'Yes', 1.83, 3.25, 0.12]], 
[['X0303', 3625252, 1.23, 'Yes', 'No', 1.86, 3.65, 0.15],
['X0333', 3625257, 1.23, 'Yes', 'No', 1.86, 3.65, 0.15]], 
[['X0670', 1205203, 1.87, 'Yes', 'No', 1.88, 1.25, 1.12]], 
[['X1070', 1124521, 0.25, 'No', 'No', 2.1, 0.6, 0.03], 
['X1070', 3302145, 0.25, 'No', 'No', 2.1, 0.6, 0.03]], 
[['X1070', 8952631, 0.25, 'No', 'No', 2.4, 0.6, 0.03]], 
[['X3330', 1123458, 0.33, 'Yes', 'Yes', 10.38, 41.11, 0.5]], 
[['X3330', 3236254, 3, 'No', 'Yes', 10.38, 41.11, 0.5]], 
[['X8670', 1205323, 1.87, 'Yes', 'No', 1.88, 1.25, 1.12]]]
>>>

然后我可以循环并用组的第一个成员中的一个覆盖X00000,但这不能保证X00000将是列表的现有列表中的一个。你知道吗

而保持原来的X数对这项任务是至关重要的。你知道吗

如有任何建议或指出类似的解决方案,不胜感激。你知道吗

非常感谢您的关注和帮助!你知道吗


Tags: no用户列表bymylistyesgroupby
2条回答

您可以创建相关列的索引(类似于DB索引)并将其用于查找。你知道吗

使用一些伪代码,可以如下所示:

indexed = {tuple(entry[2:8]): idx for idx, entry in enumerate(my_list_grouped_by_0)}

def add_new(newEntry):
    col0 = indexed.get(tuple(newEntry[2:8]))

    if col0 is None:
        <Assign new id to col0>

    my_list_grouped_by_0.append([col0] + newEntry[1:])

    <Add new entry to index if necessary>

直观的解决方案是使用生成器理解和列表切片,如下所示:

new = ['X00025', 8520025, 6.33, 'Yes', 'No', 1.83, 66.22, 0.1]  # same as X00010

new[1:] in (elem[1:] for elem in my_list_grouped_by_0))  # returns True because of X00010

但是,如果性能很重要,我无法保证此解决方案的相对速度。你知道吗

编辑:

这将是一个函数的例子,它不仅检查匹配项,还进行更新。你知道吗

def add_to_big_list(new):
    for old in my_list_grouped_by_0:
        if new[1:] == old[1:]:
            # A match was found so we replace the ID.
            old[0] = new[0]
            return
    # No match was found so we add the new entry.
    my_list_grouped_by_0.append(new)

相关问题 更多 >