Вот моя первая попытка:

successes = 0
failures = 0
blacklist = ['Team', 'Range', 'm-boot', 'b']

for dial in dials:
    for value in dial:
        if value in blacklist:
            dial.remove(value)

for dial in dials:
    for item in dial:
        if item in blacklist:
            failures = failures + 1
        else:
            successes = successes + 1

print(f'number of removed strings: {successes}')
print(f'number of strings remain unremoved: {failures}')

Выход:

number of removed strings: 7914
number of strings remain unremoved: 0

Process finished with exit code 0

Отлично! Но мне нужно удалить еще много строк. Добавьте еще один в черный список:

successes = 0
failures = 0
blacklist = ['Team', 'Range', 'm-boot', 'b', '/b']

for dial in dials:
    for value in dial:
        if value in blacklist:
            dial.remove(value)

for dial in dials:
    for item in dial:
        if item in blacklist:
            failures = failures + 1
        else:
            successes = successes + 1
print(f'number of removed strings: {successes}')
print(f'number of strings remain unremoved: {failures}')

Aaaand :

number of removed strings: 7722
number of strings remain unremoved: 54

Process finished with exit code 0

Я могу просто сказать, что код не удаляет ни одного экземпляра «Team» и «Range», каждый из которых встречается ровно один раз на каждом циферблате. Я просто новичок, так что, будь осторожен со мной?

Редактировать: кажется, все думают, что проблема с остановкой remove () после одного вхождения. Это не имеет смысла для меня. Во-первых, он находится внутри цикла, проверяя только одно значение в этом цикле, поэтому, если значение совпадает, он удаляет его, если нет, оставляет его, затем цикл перезапускается, и код снова выдает remove (), без знания предыдущих успехов или неудач. Вы можете увидеть, что это работает, как я ожидал, посмотрев на количество успехов и неудач с первой попытки. Он явно удаляет все экземпляры элементов в черном списке, но при попытке №2 он просто решает не искать команду или диапазон. Что-то, что я не упомянул, это то, что он прекращает сортировку этих двух строк независимо от того, какой индекс они имеют в черном списке. Спасибо за уделенное время.

0
user12526523 21 Дек 2019 в 05:47

2 ответа

Так как remove удаляет только первое вхождение значения в списке, оно может оставить дополнительные совпадения нетронутыми. Таким образом, вы могли бы вместо этого восстановить список, отфильтровывая нежелательные элементы с пониманием списка:

# Define a set of blacklisted values
blacklist = {'Team', 'Range', 'm-boot', 'b', '/b'}

# Filter out the elements that are in the blacklist
dials = [[val for val in dial if val not in blacklist] for dial in dials]
1
IronMan 21 Дек 2019 в 06:08

Это может произойти, если в вашем списке более одного элемента черного списка, поэтому remove просто удаляет первое совпадение. чтобы получить список с уникальными значениями, приведите list к set, а затем удалите. следовательно, удаленный элемент больше не существует в вашем списке. также вместо того, чтобы повторять список dial, я предпочитаю повторять blacklist, так как он кажется более коротким.

for dial in dials:
    dial = set(dial)
    for value in blacklist:
        if value in dial:
            dial.remove(value)
0
Moein Kameli 21 Дек 2019 в 11:40