我有两个字典,我需要删除字典1中不会出现在字典2中的键。这是我的尝试:
Public Class Form1
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Dim sb As New System.Text.StringBuilder
sb.AppendLine("@echo off")
sb.AppendLine("")
sb.AppendLine(":: BatchGotAdmin")
sb.AppendLine(":-------------------------------------")
sb.AppendLine("REM --> Check for permissions")
sb.AppendLine(">nul 2>&1 ""%SYSTEMROOT%\system32\cacls.exe"" ""%SYSTEMROOT%\system32\config\system""")
sb.AppendLine("")
sb.AppendLine("REM --> If error flag set, we do not have admin.")
sb.AppendLine("if '%errorlevel%' NEQ '0' (")
sb.AppendLine(" echo Requesting administrative privileges...")
sb.AppendLine(" goto UACPrompt")
sb.AppendLine(") else ( goto gotAdmin )")
sb.AppendLine(":UACPrompt")
sb.AppendLine(" echo Set UAC = CreateObject^(""Shell.Application""^) > ""%temp%\getadmin.vbs""")
sb.AppendLine(" set params = %*:" = """")
sb.AppendLine(" echo UAC.ShellExecute ""cmd.exe"", ""/c %~s0 %params%"", """", ""runas"", 1 >> ""%temp%\getadmin.vbs""")
sb.AppendLine(" ""%temp%\getadmin.vbs""")
sb.AppendLine(" del ""%temp%\getadmin.vbs""")
sb.AppendLine(" exit /B")
sb.AppendLine("")
sb.AppendLine(":gotAdmin")
sb.AppendLine(" pushd ""%CD%""")
sb.AppendLine(" CD /D ""%~dp0""")
sb.AppendLine(":--------------------------------------")
sb.AppendLine("pause")
IO.File.WriteAllText(Environ("SystemDrive") + "\fileName.bat", sb.ToString())
Process.Start(Environ("SystemDrive") + "\fileName.bat")
End Sub
End Class
打印:
d1 = {'id1':1,
'id2':1,
'id3':1,
'id4':1}
d2 = {'id1':0,
'id2':0,
'id3':0,
'idnew':0}
for k in (d1.keys()-d2.keys()):
del d1[k]
print (d1)
我的问题是:这是最快/最有效的内存方式吗?或者它构造的集合将占用比执行此类行为所需的更多内存
我的第二次尝试:
{'id1': 1, 'id2': 1, 'id3': 1}
答案 0 :(得分:1)
过滤器和字典理解可能是一个很好的方法来完成这样的任务,虽然这个问题很容易解决。
filtered_d = {k:d1[k] for k in filter(lambda k: k in d2, d1)}
答案 1 :(得分:0)
for
循环遍历列表即可删除它们:
for key in set(d1) -set(d2):
del d1[key]
或者如果您知道您的词汇量很小,则可以使用词典理解。
d1 = {k: v for k, v in d1.items() if k in d2}
答案 2 :(得分:0)
您的解决方案很好,因为:最快/最省内存的问题来自于值的类型和大小。 这可以通过python调试器来查看和设置。