Latest posts on сравнение списков - вернуть не совпадения topichttps://python.su/forum/topic/581/2007-03-22T11:05:03+02:00Общий :: Python для экспертов :: сравнение списков - вернуть не совпадения
2007-03-22T11:05:03+02:00pythonwin4099<div class="code"><pre><span class="k">def</span> <span class="nf">a6</span><span class="p">():</span>
<span class="k">return</span> <span class="nb">filter</span><span class="p">(</span> <span class="k">lambda</span> <span class="n">x</span><span class="p">:</span> <span class="n">x</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">l</span><span class="p">,</span> <span class="n">l1</span> <span class="p">)</span>
</pre></div><br/><blockquote>python -m timeit “import two_list_3; two_list_3.a6()”<br/>100000 loops, best of 3: 16.1 usec per loop</blockquote>
Общий :: Python для экспертов :: сравнение списков - вернуть не совпадения
2007-03-22T10:49:32+02:00Александр Кошелев4098Такой вариант неожиданно для меня очень медленный:<br/><div class="code"><pre><span class="nb">filter</span><span class="p">(</span> <span class="k">lambda</span> <span class="n">x</span><span class="p">:</span> <span class="n">x</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">l</span><span class="p">,</span> <span class="n">l1</span> <span class="p">)</span>
</pre></div>
Общий :: Python для экспертов :: сравнение списков - вернуть не совпадения
2007-03-22T09:24:57+02:00pythonwin4095<div class="code"><pre><span class="n">l</span><span class="o">=</span><span class="p">[</span><span class="s">"</span><span class="si">%s</span><span class="s">"</span><span class="o">%</span><span class="n">e</span> <span class="k">for</span> <span class="n">e</span> <span class="ow">in</span> <span class="nb">xrange</span><span class="p">(</span><span class="mi">10</span><span class="p">)]</span>
<span class="n">l1</span><span class="o">=</span><span class="p">[</span><span class="s">'10'</span><span class="p">]</span><span class="o">+</span><span class="n">l</span><span class="o">+</span><span class="p">[</span><span class="s">'-1</span><span class="se">\n</span><span class="s">'</span><span class="p">]</span>
<span class="k">def</span> <span class="nf">a1</span><span class="p">():</span>
<span class="n">l_1</span> <span class="o">=</span> <span class="n">l1</span><span class="p">[:]</span>
<span class="k">for</span> <span class="n">e</span> <span class="ow">in</span> <span class="n">l1</span><span class="p">:</span>
<span class="k">if</span> <span class="n">e</span> <span class="ow">in</span> <span class="n">l</span><span class="p">:</span>
<span class="n">l_1</span><span class="o">.</span><span class="n">remove</span><span class="p">(</span><span class="n">e</span><span class="p">)</span>
<span class="k">return</span> <span class="n">l_1</span>
<span class="k">def</span> <span class="nf">a2</span><span class="p">():</span>
<span class="k">return</span> <span class="p">[</span><span class="n">e</span> <span class="k">for</span> <span class="n">e</span> <span class="ow">in</span> <span class="n">l1</span> <span class="k">if</span> <span class="ow">not</span><span class="p">(</span><span class="n">e</span> <span class="ow">in</span> <span class="n">l</span><span class="p">)]</span>
<span class="n">a3</span> <span class="o">=</span> <span class="k">lambda</span> <span class="n">l</span><span class="p">,</span><span class="n">l1</span><span class="p">:</span> <span class="p">[</span><span class="n">e</span> <span class="k">for</span> <span class="n">e</span> <span class="ow">in</span> <span class="n">l1</span> <span class="k">if</span> <span class="ow">not</span><span class="p">(</span><span class="n">e</span> <span class="ow">in</span> <span class="n">l</span><span class="p">)]</span>
<span class="k">def</span> <span class="nf">a4</span><span class="p">():</span>
<span class="n">l_1</span> <span class="o">=</span> <span class="n">l1</span><span class="p">[:]</span>
<span class="p">[</span><span class="n">l_1</span><span class="o">.</span><span class="n">remove</span><span class="p">(</span><span class="n">e</span><span class="p">)</span> <span class="k">for</span> <span class="n">e</span> <span class="ow">in</span> <span class="n">l1</span> <span class="k">if</span> <span class="p">(</span><span class="n">e</span> <span class="ow">in</span> <span class="n">l</span><span class="p">)]</span>
<span class="k">return</span> <span class="n">l_1</span>
<span class="c">#</span>
<span class="k">def</span> <span class="nf">a5</span><span class="p">():</span>
<span class="k">return</span> <span class="nb">list</span><span class="p">(</span><span class="nb">set</span><span class="p">(</span><span class="n">l1</span><span class="p">)</span><span class="o">.</span><span class="n">difference</span><span class="p">(</span><span class="n">l</span><span class="p">))</span>
<span class="k">def</span> <span class="nf">simple_test</span><span class="p">():</span>
<span class="n">l</span><span class="o">=</span><span class="p">[</span><span class="s">"</span><span class="si">%s</span><span class="s">"</span><span class="o">%</span><span class="n">e</span> <span class="k">for</span> <span class="n">e</span> <span class="ow">in</span> <span class="nb">xrange</span><span class="p">(</span><span class="mi">10</span><span class="p">)]</span>
<span class="n">l1</span><span class="o">=</span><span class="p">[</span><span class="s">'10'</span><span class="p">]</span><span class="o">+</span><span class="n">l</span><span class="o">+</span><span class="p">[</span><span class="s">'-1</span><span class="se">\n</span><span class="s">'</span><span class="p">]</span>
<span class="n">res</span><span class="o">=</span><span class="p">[</span><span class="s">'10'</span><span class="p">,</span><span class="s">'-1</span><span class="se">\n</span><span class="s">'</span><span class="p">]</span>
<span class="k">print</span> <span class="n">a1</span><span class="p">()</span> <span class="o">==</span> <span class="n">res</span>
<span class="k">print</span> <span class="n">a2</span><span class="p">()</span> <span class="o">==</span> <span class="n">res</span>
<span class="k">print</span> <span class="n">a3</span><span class="p">(</span><span class="n">l</span><span class="p">,</span> <span class="n">l1</span><span class="p">)</span> <span class="o">==</span> <span class="n">res</span>
<span class="k">print</span> <span class="n">a4</span><span class="p">()</span> <span class="o">==</span> <span class="n">res</span>
</pre></div><br/><blockquote>python -m timeit “import two_list_3; two_list_3.a5()”<br/>100000 loops, best of 3: 11.6 usec per loop</blockquote>
Общий :: Python для экспертов :: сравнение списков - вернуть не совпадения
2007-03-21T15:27:45+02:00ofigetitelno4081:)<br/>list(set(l1).difference(l))
Общий :: Python для экспертов :: сравнение списков - вернуть не совпадения
2007-03-21T14:22:42+02:00Tmr4079Но при этом нужно помнить, что копируются не объекты, а референсы на объекты. Т.е.<br/>>>> a = ['aaa', ]<br/>>>> b = a<br/>>>> print ‘a = ’, a, ‘ b = ’, b<br/>a = ['aaa', ] b = ['aaa', ]<br/>>>> b = ‘bbb’<br/>>>> print ‘a = ’, a, ‘ b = ’, b<br/>a = ['aaa', ] b = ['bbb', ]<br/>>>> b = “b is share it!”<br/>>>> print ‘a = ’, a, ‘ b = ’, b<br/>a = ['aaa', ] b = ['bbb', ]
Общий :: Python для экспертов :: сравнение списков - вернуть не совпадения
2007-03-21T13:33:13+02:00xonix4074Небольшое дополнение, списки удобно копировать через срезы<br/><div class="code"><pre><span class="n">a</span> <span class="o">=</span> <span class="p">[</span><span class="mi">1</span><span class="p">,</span><span class="mi">2</span><span class="p">,</span><span class="mi">3</span><span class="p">]</span>
<span class="n">b</span> <span class="o">=</span> <span class="n">a</span><span class="p">[:]</span>
</pre></div>
Общий :: Python для экспертов :: сравнение списков - вернуть не совпадения
2007-03-21T13:14:37+02:00pythonwin4068<blockquote>python -m timeit “import two_list_2; two_list_2.a1()”<br/>10000 loops, best of 3: 22.2 usec per loop<br/><br/>python -m timeit “import two_list_2; two_list_2.a2()”<br/>100000 loops, best of 3: 10.3 usec per loop<br/><br/>python -m timeit “import two_list_2; two_list_2.a3(two_list_2.l,two_list_2.l1)”<br/>100000 loops, best of 3: 10.6 usec per loop<br/><br/>python -m timeit “import two_list_2; two_list_2.a4()”<br/>10000 loops, best of 3: 24 usec per loop</blockquote>сделал несколько тестов - самый пока самая быстрая a2()
Общий :: Python для экспертов :: сравнение списков - вернуть не совпадения
2007-03-21T13:04:01+02:00Tmr4067Замечания по коду.<br/>Функция a1() модифицирует список l во время итераций в цикле. В результате результат неверный<br/>Вместо l_1=l нужно делать<br/>import copy<br/>l_1 = copy.copy(l) # объекты по ссылке в списке не копируются, копируются ссылки<br/># или<br/>l_1 = copy.deepcopy(l) # l копируется полностью<br/>Так же нужно поменять местами в коде a1() l и l1 т.е.<br/>def a1():<br/> l_1 = copy.copy(l1)<br/> for e in l1:<br/> if e in l:<br/> l_1.remove(e)<br/> return l_1<br/>В a4() дела обстоят аналогично.<br/>Предлагаю для тестирования новый вариант:<br/>import copy<br/><br/>def a1():<br/> l_1 = copy.copy(l1)<br/> for e in l1:<br/> if e in l:<br/> l_1.remove(e)<br/> return l_1<br/><br/>def a2():<br/> return <br/> <br/>a3 = lambda l,l1: <br/><br/>def a4():<br/> l_1 = copy.copy(l1)<br/> <br/> return l_1<br/><br/>def simple_test():<br/> l=<br/> l1=+l+<br/> res= <br/> print a1() == res<br/> print a2() == res<br/> print a3(l, l1) == res<br/> print a4() == res
Общий :: Python для экспертов :: сравнение списков - вернуть не совпадения
2007-03-21T12:34:56+02:00Striver4064Пробовал через set - тормознее получается.
Общий :: Python для экспертов :: сравнение списков - вернуть не совпадения
2007-03-21T08:55:06+02:00pythonwin4045есть два списка:<br/><div class="code"><pre><span class="n">l</span><span class="o">=</span><span class="p">[</span><span class="s">"</span><span class="si">%s</span><span class="s">"</span><span class="o">%</span><span class="n">e</span> <span class="k">for</span> <span class="n">e</span> <span class="ow">in</span> <span class="nb">xrange</span><span class="p">(</span><span class="mi">10</span><span class="p">)]</span>
<span class="n">l1</span><span class="o">=</span><span class="p">[</span><span class="s">'10'</span><span class="p">]</span><span class="o">+</span><span class="n">l</span><span class="o">+</span><span class="p">[</span><span class="s">'-1</span><span class="se">\n</span><span class="s">'</span><span class="p">]</span>
</pre></div>и есть функции которые возвращают список элементов второго списка, которых нет в первом:<br/><div class="code"><pre><span class="k">def</span> <span class="nf">a1</span><span class="p">():</span>
<span class="n">l_1</span><span class="o">=</span><span class="n">l</span>
<span class="k">for</span> <span class="n">e</span> <span class="ow">in</span> <span class="n">l</span><span class="p">:</span>
<span class="k">if</span> <span class="n">e</span> <span class="ow">in</span> <span class="n">l1</span><span class="p">:</span>
<span class="n">l_1</span><span class="o">.</span><span class="n">remove</span><span class="p">(</span><span class="n">e</span><span class="p">)</span>
<span class="k">return</span> <span class="n">l_1</span>
<span class="k">def</span> <span class="nf">a2</span><span class="p">():</span>
<span class="k">return</span> <span class="p">[</span><span class="n">e</span> <span class="k">for</span> <span class="n">e</span> <span class="ow">in</span> <span class="n">l1</span> <span class="k">if</span> <span class="ow">not</span><span class="p">(</span><span class="n">e</span> <span class="ow">in</span> <span class="n">l</span><span class="p">)]</span>
<span class="n">a3</span> <span class="o">=</span> <span class="k">lambda</span> <span class="n">l</span><span class="p">,</span><span class="n">l1</span><span class="p">:</span> <span class="p">[</span><span class="n">e</span> <span class="k">for</span> <span class="n">e</span> <span class="ow">in</span> <span class="n">l1</span> <span class="k">if</span> <span class="ow">not</span><span class="p">(</span><span class="n">e</span> <span class="ow">in</span> <span class="n">l</span><span class="p">)]</span>
<span class="k">def</span> <span class="nf">a4</span><span class="p">():</span>
<span class="n">l_1</span> <span class="o">=</span> <span class="n">l1</span>
<span class="p">[</span><span class="n">l_1</span><span class="o">.</span><span class="n">remove</span><span class="p">(</span><span class="n">e</span><span class="p">)</span> <span class="k">for</span> <span class="n">e</span> <span class="ow">in</span> <span class="n">l_1</span> <span class="k">if</span> <span class="ow">not</span><span class="p">(</span><span class="n">e</span> <span class="ow">in</span> <span class="n">l</span><span class="p">)]</span>
<span class="k">return</span> <span class="n">l_1</span>
</pre></div><br/>результаты<br/><blockquote>python -m timeit “import two_list_1; two_list_1.a1()”<br/>100000 loops, best of 3: 3.19 usec per loop</blockquote><blockquote>python -m timeit “import two_list_1; two_list_1.a2()”<br/>100000 loops, best of 3: 10.7 usec per loop</blockquote><blockquote>python -m timeit “import two_list_1; two_list_1.a3(two_list_1.l, two_list_1.l1)”<br/>100000 loops, best of 3: 10.2 usec per loop</blockquote><blockquote>python -m timeit “import two_list_1; two_list_1.a4()”<br/>100000 loops, best of 3: 8.32 usec per loop</blockquote>какие есть способы более быстрого сравнения списков?