按每个元组中的值对元组列表进行分区

3
我正在尝试将一组数据分为两个不同的列表,一个是全职列表,另一个是兼职列表。但这似乎无法正常工作。有人能指出我哪里错了吗?
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)

5
如果 temp2[0] 的值等于 var1,则使用 if (temp2[0] == var1): - CDJB
3
更广泛地讲,考虑在你的 if 语句之前添加一个 print 语句,以验证你使用的变量包含你认为的数据。 - larsks
2
你有一个由单元素列表组成的元组列表。因此,datadump[b][1] 得到一个列表。建议先打印 temp2 作为调试的第一步。通常通过打印进行调试是帮助很多新手的方法。 ;) - h4z3
另一件事是考虑更改您的数据结构(如果可能的话),将其简单地更改为字符串,而不是一个元素的列表... - Tomerikoo
由于您是初学者,我建议您为变量找到更具描述性的名称... - thebjorn
3个回答

4

通过修改解决此问题。

if (temp2 == var1):

to

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']

将数据更改为不使用字符串字段的列表。 - eckes

3

非答案:仅提供建议。学习如何使用Python调试器。

python -m pdb <pythonscript.py>

在这种情况下,可以在第9行设置一个断点。
b 9

运行程序

c

当出现故障时,查看temp2。
p temp2

它告诉你

['FullTime']

看看 var1

p var1

这会告诉你

'FullTime'

这就是你的问题所在。

1

如果您使用描述性的名称来命名变量和函数,您将更好地理解代码:

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:
    ...

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接