我如何检查项目b是否在a,并且找到的匹配项目a不应该用于下一个匹配?
目前此代码将匹配2 in b.
a = [3,2,5,4]
b = [2,4,2]
for i in b:
if i in a:
print "%d is in a" % i
Run Code Online (Sandbox Code Playgroud)
这是必需的输出:
2 => 2 is in a
4 => 4 is in a
2 =>
Run Code Online (Sandbox Code Playgroud)
编辑:示例2:
a = [3,2,2,4]
b = [2,4,2]
Run Code Online (Sandbox Code Playgroud)
输出应该是
2 => 2 is in a
4 => 4 is in a
2 => 2 is in a
Run Code Online (Sandbox Code Playgroud)
(很长的帖子,但完全阅读,解决方案在最后).
删除找到的值或在另一个dict中注册.
更好的方法是计算每个阵列中的外观数量,并测试有多少是常见的.
对于第二种情况,你有
用于a:
3出现1次2出现1次5次出现1次4次出现1次
用于b:
2出现2次4次出现1次
将这些值保存在词典中:
a_app = {3:1, 2:1, 5:1, 4:1}
b_app = {2:2, 4:1}
Run Code Online (Sandbox Code Playgroud)
现在,它很简单:
for i in b:
if a_app.has_key(i) and a_app[i] > 0:
a_app[i] -= 1
Run Code Online (Sandbox Code Playgroud)
b_app在其他情况下将使用该词典.
这是我编写的测试脚本(测试此处发布的所有测试用例):
def f(a, b):
a_app = {}
for i in a:
if not a_app.has_key(i):
a_app[i] = 0
a_app[i] += 1
print a_app
for i in b:
print i, '=>',
if a_app.has_key(i) and a_app[i] > 0:
a_app[i] -= 1
print i, ' is in a',
print '.'
f([1,1,2],[1,1])
f([3,2,5,4],[2,4,2])
f([3,2,2,4],[2,4,2])
f([3,2,5,4],[2,3,2])
Run Code Online (Sandbox Code Playgroud)
这是输出:
$ python 1.py
{1: 2, 2: 1}
1 => 1 is in a .
1 => 1 is in a .
{2: 1, 3: 1, 4: 1, 5: 1}
2 => 2 is in a .
4 => 4 is in a .
2 => .
{2: 2, 3: 1, 4: 1}
2 => 2 is in a .
4 => 4 is in a .
2 => 2 is in a .
{2: 1, 3: 1, 4: 1, 5: 1}
2 => 2 is in a .
3 => 3 is in a .
2 => .
Run Code Online (Sandbox Code Playgroud)
一切都很完美,没有订单丢失:)
编辑:更新了@Avaris的建议,此脚本如下所示:
import collections
def f(a, b):
a_app = collections.Counter(a)
for i in b:
print i, '=>',
if i in a_app and a_app[i] > 0:
a_app[i] -= 1
print i, ' is in a',
print '.'
print ''
f([1,1,2],[1,1])
f([3,2,5,4],[2,4,2])
f([3,2,2,4],[2,4,2])
f([3,2,5,4],[2,3,2])
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
17772 次 |
| 最近记录: |