[英]Check intersection of two lists
我將關鍵字歸類為以下嵌套列表,
Keywords_33=[('File_2', ['with', 'as']),
('Module_2', ['from', 'import']),
('Constant_3', {'bool': ['False', 'True'],
'none': ['None']}),
('Operator_4', {'boolean_operation': {'or', 'and', 'not'},
'comparison': {'is'}}),
('Container_operation_2', ['in', 'del']),
('Klass_1', ['class']),
('Function_7',['lambda', 'def', 'pass',
'global', 'nonlocal',
'return', 'yield']),
('Repetition_4', ['while', 'for', 'continue', 'break']),
('Condition_3', ['if', 'elif', 'else']),
('Debug_2', ['assert', 'raise']),
('Exception_3', ['try', 'except', 'finally'])]
我打算按類別確認每個關鍵字是否正確。 我認為最方便的方法是首先將Keywords_33
轉換為字符串。
from keyword import kwlist
In [55]: print(kwlist)
['False', 'None', 'True', 'and', 'as', 'assert', 'break', 'class', 'continue', 'def', 'del', 'elif', 'else', 'except', 'finally', 'for', 'from', 'global', 'if', 'import', 'in', 'is', 'lambda', 'nonlocal', 'not', 'or', 'pass', 'raise', 'return', 'try', 'while', 'with', 'yield']
In [54]: from keyword import kwlist
...: s = str(Keywords_33)
...: [keyword for keyword in kwlist if keyword not in s]
...:
Out[54]: []
# It indicate no keyword left
如何優雅地完成這樣的任務?
依靠字典/列表的嵌套列表的字符串表示形式有點危險,因為您可以匹配不需要的單詞/子字符串(示例elif
包含if
,如果您的列表包含elif
,那么它也會匹配if
。 re.findall
可以工作,在引號之間提取文本,但這仍然是一個技巧。
相反,您可以創建一個dict值列表或列表(取決於類型),從而產生:
['with', 'as', 'from', 'import', ['None'], ['False', 'True'], {'and', 'or', 'not'}, {'is'}, 'in', 'del', 'class', 'lambda', 'def', 'pass', 'global', 'nonlocal', 'return', 'yield', 'while', 'for', 'continue', 'break', 'if', 'elif', 'else', 'assert', 'raise', 'try', 'except', 'finally']
然后在不規則的項目列表(列表的平坦化(不規則)列表 )上使用展平配方,轉換為set
和減法兩種方式/相交:
Keywords_33=[('File_2', ['with', 'as']),
('Module_2', ['from', 'import']),
('Constant_3', {'bool': ['False', 'True'],
'none': ['None']}),
('Operator_4', {'boolean_operation': {'or', 'and', 'not'},
'comparison': {'is'}}),
('Container_operation_2', ['in', 'del']),
('Klass_1', ['class']),
('Function_7',['lambda', 'def', 'pass',
'global', 'nonlocal',
'return', 'yield']),
('Repetition_4', ['while', 'for', 'continue', 'break']),
('Condition_3', ['if', 'elif', 'else']),
('Debug_2', ['assert', 'raise']),
('Exception_3', ['try', 'except', 'finally'])]
import collections
from keyword import kwlist
def flatten(l):
for el in l:
if isinstance(el, collections.Iterable) and not isinstance(el, (str, bytes)):
yield from flatten(el)
else:
yield el
my_keywords = set(flatten(x for _,l in Keywords_33 for x in (l if isinstance(l,list) else l.values())))
在那種情況下set(kwlist) == my_keywords
Keywords_33=[('File_2', ['with', 'as']),
('Module_2', ['from', 'import']),
('Constant_3', {'bool': ['False', 'True'],
'none': ['None']}),
('Operator_4', {'boolean_operation': {'or', 'and', 'not'},
'comparison': {'is'}}),
('Container_operation_2', ['in', 'del']),
('Klass_1', ['class']),
('Function_7',['lambda', 'def', 'pass',
'global', 'nonlocal',
'return', 'yield']),
('Repetition_4', ['while', 'for', 'continue', 'break']),
('Condition_3', ['if', 'elif', 'else']),
('Debug_2', ['assert', 'raise']),
('Exception_3', ['try', 'except', 'finally'])]
kwlist = ['False', 'None', 'True', 'and', 'as', 'assert', 'break', 'class', 'continue', 'def',
'del', 'elif', 'else', 'except', 'finally', 'for', 'from', 'global', 'if', 'import',
'in','is', 'lambda', 'nonlocal', 'not', 'or', 'pass', 'raise', 'return', 'try', 'while',
'with', 'yield']
if __name__ == '__main__':
result = []
for kw in kwlist:
for key in Keywords_33:
if isinstance(key[1], list):
for i in key[1]:
if kw == i:
result.append(i)
elif isinstance(key[1], dict):
for value in key[1].values():
for j in value:
if kw == j:
result.append(j)
print(result)
我區分,如果第二個元素是列表或字典。 (注意,在這種情況下,它起作用了,因為每個元組恰好包含兩個元素)。 在列表的情況下,如果元素在kwlist中,我可以輕松地進行迭代並進行比較。 對於字典,如果值在kwlist中,我可以遍歷字典的值並進行比較
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.