список одного строкового элемента преобразуется в список символов - PullRequest
0 голосов
/ 04 мая 2020

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

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

import itertools


def not_mine(c):
    d = {'John':['mid', 'forward'],
         'Lana':['mid'],
         'Jacob':['defence', 'mid'],
         'Ian':['goal', 'mid']}

    n = itemgetter(*c)(d)
    n = list(set(itertools.chain.from_iterable(n)))

    return n

def mine(c):
    name = not_mine(c)
    name_1 = list(name)
    print(name_1)

mine(['Jacob', 'Ian'])
['defence', 'goal', 'mid']

mine(['Lana'])
['i', 'm', 'd']

Есть ли способ предотвратить второй случай? Это должен быть список из одного элемента ['mid'].

1 Ответ

0 голосов
/ 04 мая 2020

Итераторы

Функция set использует первый аргумент в качестве итератора для создания последовательности элементов. str изначально является итератором. Другими словами, вы можете l oop над str и назначить переменной для каждого символа в строке за итерацию.

for whatami in "hi!":
    print(whatami)
h
i
!

Если вы хотите обработать ввод одной строки в виде отдельного элемента, явно передаваемый аргумент итератора для установки (list работает так же, кстати) с одним элементом в нем. Кортеж также является итератором. Давайте попробуем использовать это, чтобы доказать нашу теорию

t1 = ('ourstring', )
print(f"t1 is of type {type(t1)}")
s1 = set(t1)
print(s1)
t1 is of type <class 'tuple'>
{'ourstring'}

Это работает!
То, что мы сделали с ('ourstring', ), это явное определение кортежа с одним элементом. Есть знакомый разделитель ,, который используется для обозначения того, что «этот кортеж создается только с одним элементом». Вы можете рассмотреть два подхода.
Самый простой способ - согласовать разделитель во входных данных, таких как значения, разделенные запятыми. firstvalue,secondvalue,etc. Недостатком этого является то, что вы быстро столкнетесь с ограничениями того, какие данные вы можете получить.

Чтобы упростить разработку, argparse настоятельно рекомендуется использовать аргументы командной строки. Это встроенный, закаленный в бою пакет, созданный для выполнения задач такого типа. В первом примере docs даже отображается многозначное поле.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...