从其他列表中删除列表的内容

时间:2019-07-04 02:22:18

标签: python list

我有一些代码可以创建一个从1到407的数字列表。我想要这样做是为了将“最终”和“ super_rare”列表中的数字从“公共”列表中删除。我怎样才能做到这一点?这是我的通用代码。

import random

def common(x):
    list = []
    for i in range(1,x+1):
        list.append(i)
    return (list)

cid = common(407)


ultimate = [404, 200, 212, 15, 329, 214, 406, 259, 126, 160, 343, 180, 169, 297, 226, 305, 250, 373, 142, 357, 181, 113, 149, 399, 287, 341, 37, 284, 41, 328, 400, 217, 253, 204, 290, 18, 174, 36, 310, 303, 6, 108, 47, 298, 130]

super_rare = [183, 349, 134, 69, 103, 342, 83, 380, 93, 56, 86, 95, 147, 161, 403, 197, 215, 312, 375, 359, 263, 221, 340, 102, 153, 234, 54, 7, 238, 193, 90, 367, 197, 397, 33, 366, 334, 222, 394, 371, 313, 83, 276, 35, 351, 83, 347, 170, 57, 201, 137, 188, 179, 170, 65, 107, 234, 48, 2, 85, 74, 221, 23, 171, 101, 377, 63, 248, 102, 272, 129, 276, 86, 88, 51, 197, 248, 202, 244, 153, 138, 101, 330, 68, 368, 292, 340, 315, 185, 219, 381, 89, 274, 175, 385, 19, 257, 313, 191, 211]


def new_list(cid, ultimate):
    new_list = []
    for i in range(len(cid)):
        new_list.append(cid[i])

    for i in range(len(ultimate)):
        new_list.remove(ultimate[i])
    return (new_list)

#print (new_list(cid, ultimate))
cid_mod0 = new_list(cid, ultimate)
cid_mod1 = new_list(cid_mod0, super_rare)

print (cid_mod0)

大多数印刷品和其他印刷品只是试图查看其是否有效。

5 个答案:

答案 0 :(得分:0)

我建议为此使用套组。您可以检查项目是否在固定时间内处于集合中。例如:

import random

def common(x):
   return list(range(1, x + 1))

cid = common(407)

ultimate = { 404, 200, ... }
super_rare = { 183, 349, ... }

def list_difference(l, s):
  return [ elem for elem in l if elem not in s ]

cid_mod0 = list_difference(cid, ultimate)
cid_mod1 = list_difference(cid_mod0, super_rare)

如果您不在乎结果列表的顺序,则可以为此使用一个集合,从而更加方便:

import random

def common(x):
   return list(range(1, x + 1))

cid = set(common(407))

ultimate = { 404, 200, ... }
super_rare = { 183, 349, ... }

cid_mod0 = cid - ultimate
cid_mod1 = cid_mod0 - super_rare

答案 1 :(得分:0)

使用此循环可删除super_rareultimate列表中不常见的元素:

for x, cnum in enumerate(cid):
    if cnum in ultimate or cnum in super_rare:
        del cid[x]
print(cid)

循环假定您已经建立了一个名为cid的列表。

答案 2 :(得分:0)

通过列表理解,您可以创建目标列表,其中包括目标范围内的所有数字,但不包括ultimatesuper_rare列表中的那些数字。

my_filtered_list = [i for i in range(1, 408) if i not in ultimate and i not in super_rare]
print(my_filtered_list)

答案 3 :(得分:0)

union的两组数字都排除在外。

>>> su = set(ultimate) | set(super_rare)

然后根据该值是否不存在来filter输入列表。

>>> list(filter(lambda i: i not in su, cid))
[1, 3, 4, 5, 8, 9, 10, 11, 12, 13, 14, 16, 17, 20, 21, 22, 24, 25, 26, 27, 28, 
 29, 30, 31, 32, 34, 38, 39, 40, 42, 43, 44, 45, 46, 49, 50, 52, 53, 55, 58, 59, 
 60, 61, 62, 64, 66, 67, 70, 71, 72, 73, 75, 76, 77, 78, 79, 80, 81, 82, 84, 87, 
 91, 92, 94, 96, 97, 98, 99, 100, 104, 105, 106, 109, 110, 111, 112, 114, 115, 
 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 127, 128, 131, 132, 133, 135, 
 136, 139, 140, 141, 143, 144, 145, 146, 148, 150, 151, 152, 154, 155, 156, 157, 
 158, 159, 162, 163, 164, 165, 166, 167, 168, 172, 173, 176, 177, 178, 182, 184, 
 186, 187, 189, 190, 192, 194, 195, 196, 198, 199, 203, 205, 206, 207, 208, 209, 
 210, 213, 216, 218, 220, 223, 224, 225, 227, 228, 229, 230, 231, 232, 233, 235, 
 236, 237, 239, 240, 241, 242, 243, 245, 246, 247, 249, 251, 252, 254, 255, 256, 
 258, 260, 261, 262, 264, 265, 266, 267, 268, 269, 270, 271, 273, 275, 277, 278, 
 279, 280, 281, 282, 283, 285, 286, 288, 289, 291, 293, 294, 295, 296, 299, 300, 
 301, 302, 304, 306, 307, 308, 309, 311, 314, 316, 317, 318, 319, 320, 321, 322, 
 323, 324, 325, 326, 327, 331, 332, 333, 335, 336, 337, 338, 339, 344, 345, 346, 
 348, 350, 352, 353, 354, 355, 356, 358, 360, 361, 362, 363, 364, 365, 369, 370, 
 372, 374, 376, 378, 379, 382, 383, 384, 386, 387, 388, 389, 390, 391, 392, 393, 
 395, 396, 398, 401, 402, 405, 407]

如果您不想使用过滤器,只需使用列表理解即可。

>>> [v for v in cid if v not in su]

您也可以使用

这样的集合来完成整个操作
>>> list(set(cid) - (set(ultimate) | set(super_rare)))

其他人已经建议了这一点(我不相信)。我不确定以正确的顺序返回的保证程度。似乎对我的py2和py3没问题,但是做为列表的最后一步将为您提供绝对保证的顺序(而不是实现细节),并且不需要最后一步转换回列表。

如果要查看原始列表中的更改,只需将其分配回原始变量即可。

cid = [v for v in cid if v not in su]

尽管这会为同一变量分配不同的列表,所以其他引用该列表的人将看不到更改。您可以在作业前后调用id(cid),以查看其不同的列表。

如果您想分配回完全相同的列表实例,可以使用

cid[:] = [v for v in cid if v not in su]

和ID将保持不变。

答案 4 :(得分:0)

如果要保留cid的原始顺序,可以尝试使用OrderDict将cid转换为ordered dict对象,然后删除所需的键,代码会是这样的:

from random import choices, seed
from collections import OrderedDict

seed(123)

ultimate = [404, 200, 212, 15, 329, 214, 406, 259, 126, 160, 343, 180, 169, 297, 226, 305, 250, 373, 142, 357, 181, 113, 149, 399, 287, 341, 37, 284, 41, 328, 400, 217, 253, 204, 290, 18, 174, 36, 310, 303, 6, 108, 47, 298, 130]
super_rare = [183, 349, 134, 69, 103, 342, 83, 380, 93, 56, 86, 95, 147, 161, 403, 197, 215, 312, 375, 359, 263, 221, 340, 102, 153, 234, 54, 7, 238, 193, 90, 367, 197, 397, 33, 366, 334, 222, 394, 371, 313, 83, 276, 35, 351, 83, 347, 170, 57, 201, 137, 188, 179, 170, 65, 107, 234, 48, 2, 85, 74, 221, 23, 171, 101, 377, 63, 248, 102, 272, 129, 276, 86, 88, 51, 197, 248, 202, 244, 153, 138, 101, 330, 68, 368, 292, 340, 315, 185, 219, 381, 89, 274, 175, 385, 19, 257, 313, 191, 211]

cid = OrderedDict.fromkeys(choices(range(407), k=407))
_ = map(cid.pop, set(ultimate + super_rare))

result = cid.keys()

如果您不需要原始顺序,则可以尝试将cid转换为dict,从哈希图中删除键是超快的,代码如下:

cid = dict.fromkeys(range(407))
_ = map(cid.pop, set(ultimate + super_rare))

result = cid.keys()

除了字典方法外,您还可以尝试将所有内容转换为set变量,如下所示:

result = set(range(407)) - set(ultimate) - set(super_rare)

希望有帮助。