在Python中需要比较保留重复项时两个列表中的元素

时间:2016-03-23 18:51:09

标签: python list

我想比较两个列表。我想在第一个列表中找到在第二个列表中没有相应条目的元素(顺序并不重要):

 $url = 'http://www.mywebsite.com/sweeps/test.txt';
 $content = file_get_contents($url);
 $json = json_decode($content,true);

 $tmp = explode('][', $json_string);
 if (!count($tmp)) {
 $json = json_decode($json_string);

 var_dump($json);
 } else {
 foreach ($tmp as $json_part) {
    $json = json_decode('['.rtrim(ltrim($json_string, '['), ']').']');

    var_dump($json);
}
}
 require_once 'csrest_general.php';
 require_once 'csrest_subscribers.php';

 $auth = array(
 'api_key' => 'xxxxxxxxxxxxxxx');
 $wrap = new CS_REST_Subscribers('xxxxxxxxxx', $auth);
 $result = $wrap->add($json(
'EmailAddress' => $email,
'Name' => $custom_3_first,
'Resubscribe' => false
 ));

所以我希望输出为

a = ['hi', 'hi', 'bye', 'hi']
b = ['hi', 'hi', 'bye']

因为第一个列表有一个额外的' hi'在它中没有出现在第二个列表中。

如果我选择the usual techniques之一,我可以使用列表理解:

c = ['hi']  

给了我[x for x in a if x not in b] ,这不是我想要的。

我尝试过的事情涉及使用具有相同结果的[]运算符,因为该操作会将列表成员减少为唯一性。

这似乎是一个简单的操作。我是否需要首先枚举列表中的每个元素,并创建要比较的元组?我需要将它们放入Counter dict吗?当我只是想对列表中的元素进行简单比较时,所有这些听起来有点像矫枉过正!

2 个答案:

答案 0 :(得分:6)

Counter个对象支持多集操作:

heroku help

从柜台重建列表:

>>> from collections import Counter
>>> a = ['hi', 'hi', 'bye', 'hi']
>>> b = ['hi', 'hi', 'bye']
>>> Counter(a) - Counter(b)
Counter({'hi': 1})

答案 1 :(得分:0)

您可以简单地执行此操作,无需任何导入,使用while循环检查每个项目:

a = ['hi', 'hi', 'bye', 'hi']
b = ['hi', 'hi', 'bye']
c = []
while a:
    # Get first item (and remove).
    item = a.pop(0)
    if item in b:
        b.remove(item)
    else:
        c.append(item)

print c