使用字典理解将函数应用于每个键的特定子键
Applying function to a specific subkey for each key using a dictionary comprehension
我正在尝试执行字典理解,将函数仅应用于特定的内部子项。该函数从字符串中删除非英语单词。我希望它应用于 'title'
子键 仅 ,对于字典中的每个键。
# imports
import nltk
# function to remove non-English words
words = set(nltk.corpus.brown.words())
def strip_non_en(string, words):
" ".join(w for w in nltk.wordpunct_tokenize(string)\
if w.lower() in words or not w.isalpha())
return string
# dict example:
meta_data = {
'12345.xml': {'author': ['Presley'],
'date': 1956,
'doi': None,
'title': 'Heartbreak Hotel'},
'67890.xml': {'author': ['Iglesias'],
'date': 1972,
'doi': None,
'title': 'For a little bit of your love Por Un Poco De Tu Amor'}
}
我只能让它将函数应用到所有子键,这往往会删除 'author'
子键的内容。
感谢所有帮助。
您可以检查当前键是否为'title'
,如果是,则调用函数并将当前值传递给函数:
new_dict = {a:strip_non_en(b, words) if a == 'title' else b for a, b in meta_data.items()}
此外,您可以稍微更改函数 strip_non_en
,以便参数 words
是可选的。这样, words
不必每次都传递:
def strip_non_en(string, words=words):
" ".join(w for w in nltk.wordpunct_tokenize(string)\
if w.lower() in words or not w.isalpha())
return string
new_dict = {a:strip_non_en(b) if a == 'title' else b for a, b in meta_data.items()}
这是构建逻辑的一种方式。与 Ajax1234 类似,但我向 strip_non_en
.
添加了一个额外的可选参数
word_set = set(nltk.corpus.brown.words())
def strip_non_en(string, words=word_set, key=None):
if key in (None, 'title'):
string = ' '.join(w for w in nltk.wordpunct_tokenize(string) \
if w.lower() in words or not w.isalpha())
return string
new_dict = {a: strip_non_en(b, key=a) for a, b in meta_data.items()}
我正在尝试执行字典理解,将函数仅应用于特定的内部子项。该函数从字符串中删除非英语单词。我希望它应用于 'title'
子键 仅 ,对于字典中的每个键。
# imports
import nltk
# function to remove non-English words
words = set(nltk.corpus.brown.words())
def strip_non_en(string, words):
" ".join(w for w in nltk.wordpunct_tokenize(string)\
if w.lower() in words or not w.isalpha())
return string
# dict example:
meta_data = {
'12345.xml': {'author': ['Presley'],
'date': 1956,
'doi': None,
'title': 'Heartbreak Hotel'},
'67890.xml': {'author': ['Iglesias'],
'date': 1972,
'doi': None,
'title': 'For a little bit of your love Por Un Poco De Tu Amor'}
}
我只能让它将函数应用到所有子键,这往往会删除 'author'
子键的内容。
感谢所有帮助。
您可以检查当前键是否为'title'
,如果是,则调用函数并将当前值传递给函数:
new_dict = {a:strip_non_en(b, words) if a == 'title' else b for a, b in meta_data.items()}
此外,您可以稍微更改函数 strip_non_en
,以便参数 words
是可选的。这样, words
不必每次都传递:
def strip_non_en(string, words=words):
" ".join(w for w in nltk.wordpunct_tokenize(string)\
if w.lower() in words or not w.isalpha())
return string
new_dict = {a:strip_non_en(b) if a == 'title' else b for a, b in meta_data.items()}
这是构建逻辑的一种方式。与 Ajax1234 类似,但我向 strip_non_en
.
word_set = set(nltk.corpus.brown.words())
def strip_non_en(string, words=word_set, key=None):
if key in (None, 'title'):
string = ' '.join(w for w in nltk.wordpunct_tokenize(string) \
if w.lower() in words or not w.isalpha())
return string
new_dict = {a: strip_non_en(b, key=a) for a, b in meta_data.items()}