Python: возвращать совпадающие значения только в трех списках, но игнорировать пустые списки - PullRequest
0 голосов
/ 20 сентября 2019

Я создал три списка целых чисел (a, b и c), и они могут содержать или не содержать никаких значений.Я хочу создать новый список (newList) на основе этих существующих списков:

  • Если все три списка содержат значения, я хочу заполнить newList только значениями, общими для каждого списка (например,= [1,2,3], b = [2,3,4], c = [3,4,5], затем newList = [3])
  • Если все списки пусты, яхочу, чтобы newList также был пустым (например, a = [], b = [], c = [], затем newList = [])
  • Если один или два из списков пусты, я хочу заполнить newList с помощьюзначения, которые разделяют непустые списки (например, a = [], b = [2,3,4], c = [3,4,5], затем newList = [3,4]

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

Ниже я попробовал, ноэто выглядит действительно неэффективно.

a = [1,2,3]
b = [2,3,4]
c = [3,4,5]

newList = []

if len(a) + len(b) + len(c) != 0:
    if len(a) > 0:
        if len(b) > 0:
            if len(c) > 0:
                #a, b and c all contain values, find common values
                newList = list(set(a) & set(b) & set(c))
            else:
                #a and b contain values, c is empty. Find common values in a and b.
                newList = list(set(a) & set(b))
        else:
            if len(c) > 0:
                #a and c contain values, b is empty. Find common values in a and c.
                newList = list(set(a) & set(c))
            else
                #only a contains values. b and c are empty.
                newList = a
    else:
        if len(b) > 0:
            if len(c) > 0:
                #b and c contain values, a is empty. Find common values in b and c.
                newList = list(set(b) & set(c))
            else:
                #only b contains values. a and c are empty
                newList = b
        else len(c > 0:
            #only c contains values. a and b are empty
            newList = c
else:
    #no lists contain values, leave newList as empty

Буду очень признателен, если у кого-нибудь появятся какие-либо улучшения, заранее спасибо.

1 Ответ

3 голосов
/ 20 сентября 2019

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

def inner_join_nonempty(*iterables):
    sets = (set(iterable) for iterable in iterables)
    nonempty_sets = [s for s in sets if s]
    return set.intersection(*nonempty_sets) if nonempty_sets else set()

Использование для вашего примера:

>>> inner_join_nonempty(a, b, c)
{3}
...