Список разделов кортежей на основе значения в каждом кортеже - PullRequest
3 голосов
/ 23 января 2020

Я пытаюсь отсортировать набор данных в 2 отдельных списка, полный и неполный рабочий день. Но это не похоже на работу. Может кто-нибудь указать, где я понимаю это неправильно?

data = [(['Andrew'], ['FullTime'], [38]), 
       (['Fred'], ['PartTime'], [24]), 
       (['Chris'], ['FullTime'], [38])]

def sort(var1, datadump):
    positionlist = []
    for b in range(0, len(datadump)):
        temp2 = datadump[b][1]
        if (temp2 == var1):
            positionlist.append(datadump[b])
    return (positionlist)

FullTimeList = sort("FullTime", data) 
PartTimeList = sort("PartTime", data)

print(FullTimeList) 
print(PartTimeList)

Ответы [ 3 ]

4 голосов
/ 23 января 2020

Это решается путем изменения

if (temp2 == var1):

на

if (temp2[0] == var1):

Это происходит потому, что элементы в каждом кортеже являются списками, содержащими строку, а не сами строки.

Эту проблему также можно решить с помощью двух списочных представлений:

FullTimeList = [x for x in data if x[1][0] == 'FullTime']
PartTimeList = [x for x in data if x[1][0] == 'PartTime']
3 голосов
/ 23 января 2020

Не ответ: просто предложение. Узнайте, как использовать отладчик python.

python -m pdb <pythonscript.py>

В этом случае установите точку останова в строке 9

b 9

Запустите программу

c

Когда он сломается, посмотрите на temp2

p temp2

Он говорит вам

['FullTime']

Смотрите на var1

p var1

Он говорит вам

'FullTime'

И есть ваша проблема.

1 голос
/ 23 января 2020

Вы получите лучшее понимание, если назовете свои переменные и функции с описательными именами:

data = [(['Andrew'], ['FullTime'], [38]), 
        (['Fred'], ['PartTime'], [24]), 
        (['Chris'], ['FullTime'], [38])]

def filter_records(value, records):
    result = []

    for i in range(len(records)):  # i and j are usual variable names for indices (b is not)
        record = records[i]
        name, work, hours = record   # give names to the parts 
        if work[0] == value:         # work[0] since the values are lists (no need for parenthesis)
            result.append(record)
    return result                    # no need for parenthesis

FullTimeList = filter_records("FullTime", data) 
PartTimeList = filter_records("PartTime", data)

шаблон:

for i in range(len(records)):
    record = records[i]

- это анти-шаблон в Python - это означает, что есть лучший способ написать это:

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