SQL*_*out 2 python dictionary list
我有两本字典:
S = {0: [1, 2, 3, 4],
1: [5, 6, 7, 8, 9, 10],
2: [11, 12, 13, 14, 15]}
R = {0: [1, 2, 8],
1: [8, 5, 10, 11, 15],
2: []}
Run Code Online (Sandbox Code Playgroud)
如果列表中的任何数字匹配,我需要找出给定的键。如果他们这样做,则用“X”替换数字。
结果应该是这样的
F = {0: ['X', 'X', 3, 4],
1: ['X', 6, 7, 8, 9, 'X'],
2: [11, 12, 13, 14, 15]}
or
F = [['X', 'X', 3, 4], ['X', 6, 7, 8, 9, 'X'], [11, 12, 13, 14, 15]]
Run Code Online (Sandbox Code Playgroud)
如果 F 是第三本字典或列表列表,我无所谓。
我的代码如下:
Solution = []
for x in S.values():
for y in R.values():
for j in y:
for n, i in enumerate(x):
if j == i:
x[n] = 'X'
Solution.append(x)
Run Code Online (Sandbox Code Playgroud)
问题是我将 R 中的每个值与 S 中的每个字典值进行比较。我不明白如何独立于 [5] 比较例如 [1, 2, 3, 4] 到 [1, 2, 8] , 6, 7, 8, 9, 10] 到 [8, 5, 10, 11, 15]。
您可以使用集合:
# This modifies S in place; use a new dict if you want to keep S
for k,li1 in S.items():
li2=R.get(k,[])
diff=set(li1)-set(li2)
S[k]=[e if e in diff else 'X' for e in li1]
>>> S
{0: ['X', 'X', 3, 4], 1: ['X', 6, 7, 'X', 9, 'X'], 2: [11, 12, 13, 14, 15]}
Run Code Online (Sandbox Code Playgroud)
通过设置差异 操作,-
您可以获得第一个列表中的内容,但不能同时获取:
>>> set([1,2,3,4]) - set([2,3,8])
{1, 4}
Run Code Online (Sandbox Code Playgroud)
一旦知道这一点,就可以轻松地根据需要更改列表。
如果你想要一个列表列表,那么你可以使用理解:
LoL=[[e if e in set1 else 'X' for e in li1]
for li1,set1 in
zip(S.values(), {k:set(li1)-set(R.get(k,[]))
for k,li1 in S.items()}.values())]
>>> LoL
[['X', 'X', 3, 4], ['X', 6, 7, 'X', 9, 'X'], [11, 12, 13, 14, 15]]
Run Code Online (Sandbox Code Playgroud)
但恕我直言,循环更容易理解......