Как перебрать словарь, чтобы удалить значения, соответствующие строке? - PullRequest
0 голосов
/ 31 декабря 2018

Я хочу удалить значения из словаря, если они содержат определенную строку, и, следовательно, удалить все ключи с пустым списком в качестве значения.

mydict = {
    'Getting links from: https://www.foo.com/': 
    [
        '+---OK--- http://www.this.com/',
        '+---OK--- http://www.is.com/',
        '+-BROKEN- http://www.broken.com/',
        '+---OK--- http://www.set.com/',
        '+---OK--- http://www.one.com/'
    ],
    'Getting links from: https://www.bar.com/': 
    [
        '+---OK--- http://www.this.com/',
        '+---OK--- http://www.is.com/',
        '+-BROKEN- http://www.broken.com/'
    ],
    'Getting links from: https://www.boo.com/':
    [
        '+---OK--- http://www.this.com/',
        '+---OK--- http://www.is.com/'
    ]
}

val = "is"

for k, v in mydict.iteritems():
   if v.contains(val):
     del mydict[v]

Результат, который я хочу получить:

{
    'Getting links from: https://www.foo.com/':
    [
        '+-BROKEN- http://www.broken.com/',
        '+---OK--- http://www.set.com/',
        '+---OK--- http://www.one.com/'
    ], 
    'Getting links from: https://www.bar.com/': 
    [
        '+-BROKEN- http://www.broken.com/'
    ]
}

Как удалить все значения словаря, содержащие строку, а затем все ключи, которые не имеют значений в результате?

Ответы [ 5 ]

0 голосов
/ 31 декабря 2018

С простой петлей:

val = "is"

new_dict = dict()
for k, v in mydict.items():
    values = [i for i in v if val not in i]
    if values: new_dict[k] = values

print(new_dict)

Выход:

{'Getting links from: https://www.foo.com/': ['+-BROKEN- http://www.broken.com/', '+---OK--- http://www.set.com/', '+---OK--- http://www.one.com/'], 'Getting links from: https://www.bar.com/': ['+-BROKEN- http://www.broken.com/']}
0 голосов
/ 31 декабря 2018

Вы можете использовать понимание списка в словарном понимании.Вы не должны изменять количество элементов в словаре во время итерации этого словаря.

res = {k: [x for x in v if 'is' not in x] for k, v in mydict.items()}

# {'Getting links from: https://www.foo.com/': ['+-BROKEN- http://www.broken.com/',
#                                               '+---OK--- http://www.set.com/',
#                                               '+---OK--- http://www.one.com/'],
#  'Getting links from: https://www.bar.com/': ['+-BROKEN- http://www.broken.com/'],
#  'Getting links from: https://www.boo.com/': []}

Если вы хотите удалить элементы с пустыми значениями списка, вы можете на следующем шаге:

res = {k: v for k, v in res.items() if v}
0 голосов
/ 31 декабря 2018

Используя dict comprehension, вы можете попробовать следующее:

import re

val = 'is'

# step 1 - remove line having is
mydict = {k:[re.sub(r'.*is*.', '', x) for x in v] for k,v in mydict.items()}

# filtering out keys if there is no value - if needed
mydict = {k:v for k,v in mydict.items() if len(v) > 0}

print(mydict)

{'Getting links from: https://www.foo.com/': ['com/',
  'com/',
  '+-BROKEN- http://www.broken.com/',
  '+---OK--- http://www.set.com/',
  '+---OK--- http://www.one.com/'],
 'Getting links from: https://www.bar.com/': ['com/',
  'com/',
  '+-BROKEN- http://www.broken.com/'],
 'Getting links from: https://www.boo.com/': ['com/', 'com/']}
0 голосов
/ 31 декабря 2018

Это однострочный :

{k: [e for e in v if val not in e] for k, v in mydict.items() if any([val not in e for e in v])}

Ожидаемый результат:

Out[1]: {
    'Getting links from: https://www.bar.com/': 
    [
        '+-BROKEN- http://www.broken.com/'
    ],
    'Getting links from: https://www.foo.com/': 
    [
        '+-BROKEN- http://www.broken.com/',
        '+---OK--- http://www.set.com/',
        '+---OK--- http://www.one.com/'
    ]
}
0 голосов
/ 31 декабря 2018

Есть несколько способов сделать это.Один с использованием регулярных выражений и один без.

, если вы не знакомы с регулярными выражениями, вы можете попробовать это:

for key, value in mydict.items():
    if val in value:
        mydict.pop(key)

вывод будет:

    mydict = {'Getting links from: https://www.bar.com/': ['+---OK--- http://www.this.com/',
  '+---OK--- http://www.is.com/',
  '+-BROKEN- http://www.broken.com/'],
 'Getting links from: https://www.boo.com/': ['+---OK--- http://www.this.com/',
  '+---OK--- http://www.is.com/'],
 'Getting links from: https://www.foo.com/': ['+---OK--- http://www.this.com/',
  '+---OK--- http://www.is.com/',
  '+-BROKEN- http://www.broken.com/',
  '+---OK--- http://www.set.com/',
  '+---OK--- http://www.one.com/']}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...