Двоичный поиск нескольких ключей (Python) [дубликат]

Заимствование, немного улучшающее и упрощающее из этот пост в блоге , выглядит следующим образом: g1]

SELECT DISTINCT (:val) "Search Value", TABLE_NAME "Table", COLUMN_NAME "Column"
FROM cols,
     TABLE (XMLSEQUENCE (DBMS_XMLGEN.GETXMLTYPE(
       'SELECT "' || COLUMN_NAME || '" FROM "' || TABLE_NAME || '" WHERE UPPER("'
       || COLUMN_NAME || '") LIKE UPPER(''%' || :val || '%'')' ).EXTRACT ('ROWSET/ROW/*')))
ORDER BY "Table";

71
задан SilentGhost 19 May 2010 в 12:00
поделиться

14 ответов

Привет, это мое предложение (очень простое)

import random

i = [1,4,10,22,44,6,12] #first random list, could be change in the future
j = [1,4,10,8,15,14] #second random list, could be change in the future
for x in i: 
    if x in j: #for any item 'x' from collection 'i', find the same item in collection of 'j'
        print(x) # print out the results
1
ответ дан Artur Ludwik 19 August 2018 в 12:21
поделиться

Вы также можете использовать наборы и получить общие черты в одной строке: вычесть набор, содержащий отличия от одного из наборов.

A = [1,2,3,4]
B = [2,4,7,8]
commonalities = set(A) - (set(A) - set(B))
27
ответ дан BeyondRubicon 19 August 2018 в 12:21
поделиться

Решения, предложенные S.Mark и SilentGhost , как правило, говорят вам, как это должно быть сделано на питоническом пути, но я думал, что вам также может быть полезно узнать, почему ваш решение не работает. Проблема в том, что как только вы найдете первый общий элемент в двух списках, вы возвращаете только этот единственный элемент. Ваше решение можно было бы устранить, создав список result и собирая общие элементы в этом списке:

def common_elements(list1, list2):
    result = []
    for element in list1:
        if element in list2:
            result.append(element)
    return result

Еще более короткая версия с использованием списков:

def common_elements(list1, list2):
    return [element for element in list1 if element in list2]

, как я уже сказал, это очень неэффективный способ сделать это. Встроенные типы набора Python являются более эффективными, поскольку они реализованы внутри C.

25
ответ дан Community 19 August 2018 в 12:21
поделиться
  • 1
    Отлично подходит для обоих предложений – dlewin 21 September 2015 в 12:41
  • 2
    ПРИМЕЧАНИЕ. Вышеуказанные методы будут работать только для списков одинакового размера. Если вы работаете с списками неравного размера, как и я, вам нужно будет оценить порядок на основе len () до вызова функции: list1 = [2,2,2], list2 [2,3] - & gt; ; [2,2,2] list1 = [2,3], list2 [2,2,2] - & gt; [2] – redthumb 30 September 2016 в 11:56

В предыдущих ответах все работают, чтобы найти уникальные общие элементы, но не будут учитывать повторяющиеся элементы в списках. Если вы хотите, чтобы общие элементы отображались с тем же номером, что и их общий список в списках, вы можете использовать следующий однострочный:

l2, common = l2[:], [ e for e in l1 if e in l2 and (l2.pop(l2.index(e)) or True)]

Часть or True необходима только в том случае, если вы ожидаете, что какие-либо элементы будут оцениваться с помощью False.

8
ответ дан Dologan 19 August 2018 в 12:21
поделиться
  • 1
    Удивительное решение, кажется самым тщательным, если немного кратким – Hendeca 8 March 2017 в 22:25
  • 2
    Это должен быть ответ, который должен был быть выбран! Я предполагаю, что это также работает для неравных списков. Кроме того, в большинстве решений используется set, который не является стабильным (иначе он потерян). – lifebalance 15 June 2017 в 14:14

1) Метод 1 save1 - словарь, а затем итерация каждого элемента в списке2

def findarrayhash(a,b):
    h1={k:1 for k in a}
    for val in b:
        if val in h1:
            print("common found",val)
            del h1[val]
        else:
            print("different found",val)
    for key in h1.iterkeys():
        print ("different found",key)

Поиск общих и разных элементов:

2) Метод2 с использованием set

def findarrayset(a,b):
    common = set(a)&set(b)
    diff=set(a)^set(b)
    print list(common)
    print list(diff) 
1
ответ дан kichik 19 August 2018 в 12:21
поделиться
a_list = range(1,10)
b_list = range(5, 25)
both = []

for i in b_list:
    for j in a_list:
        if i == j:
            both.append(i)
0
ответ дан maf88_ 19 August 2018 в 12:21
поделиться
  • 1
    Пожалуйста, добавьте несколько комментариев с вашими ответами. – cosmoonot 4 April 2018 в 18:00
  • 2
    Это будет так медленно, лучше использовать сгенерированный список, такой как [i for i in x if i in y]. – maf88_ 14 May 2018 в 21:20

вы можете использовать простое понимание списка:

x=[1,2,3,4]
y=[3,4,5]
common = [i for i in x if i in y]
common: [3,4]
5
ответ дан Mahdi Ghelichi 19 August 2018 в 12:21
поделиться

Вот довольно грубый метод, который я придумал. Это, конечно, не самый эффективный, но это что-то.

Проблема, которую я нашел с некоторыми из решений здесь, состоит в том, что либо она не дает повторяющихся элементов, либо не дает правильного количества элементов, когда имеет значение порядок ввода.

#finds common elements
def common(list1, list2):
    result = []
    intersect = list(set(list1).intersection(list2))

    #using the intersection, find the min
    count1 = 0
    count2 = 0
    for i in intersect: 
        for j in list1:
            if i == j:
                count1 += 1
        for k in list2: 
            if i == k:
                count2 += 1
        minCount = min(count2,count1)
        count1 = 0
        count2 = 0

        #append common factor that many times
        for j in range(minCount):
            result.append(i)

    return result
0
ответ дан paperhawk 19 August 2018 в 12:21
поделиться
>>> list1 = [1,2,3,4,5,6]
>>> list2 = [3, 5, 7, 9]
>>> list(set(list1).intersection(list2))
[3, 5]
134
ответ дан SilentGhost 19 August 2018 в 12:21
поделиться
  • 1
    +1, но лично я использовал frozenset, поскольку он неизменен и поэтому может использоваться как ключ словаря и т. Д. – zebrabox 19 May 2010 в 12:04
  • 2
  • 3
    @SilentGhost. Как получить количество согласованных элементов из двух списков. В этом случае это 2. – Poka 9 December 2017 в 12:53
  • 4
    @Poka len (список (set (list1) .intersection (list2))) – Dharmanshu Kamra 4 January 2018 в 02:38
  • 5
    @ Дхарманшу Камра. большое спасибо – Poka 4 January 2018 в 16:04

использовать множество пересечений, set (list1) & amp; set (list2)

>>> def common_elements(list1, list2):
...     return list(set(list1) & set(list2))
...
>>>
>>> common_elements([1,2,3,4,5,6], [3,5,7,9])
[3, 5]
>>>
>>> common_elements(['this','this','n','that'],['this','not','that','that'])
['this', 'that']
>>>
>>>

Обратите внимание, что список результатов может отличаться от исходного списка.

21
ответ дан YOU 19 August 2018 в 12:21
поделиться
  • 1
    Спасибо за помощь. Поймите, где я пошла не так и что работать в следующий раз. :) – Daniel 19 May 2010 в 13:29
  • 2
    Это здорово, Даниэль :-) – YOU 19 May 2010 в 13:47
  • 3
    отличное решение. есть ли способ сохранить порядок с этим? – tarrasch 30 August 2012 в 16:47
0
ответ дан Elasri 31 October 2018 в 00:31
поделиться
0
ответ дан Kotha siddu 31 October 2018 в 00:31
поделиться
0
ответ дан maf88_ 31 October 2018 в 00:31
поделиться
0
ответ дан Sai Saagar Sharman 31 October 2018 в 00:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: