繁体   English   中英

基于每个元组中的值的元组分区列表

[英]Partition list of tuples based on a value within each tuple

我正在尝试将一组数据分类为 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)

这是通过改变解决的

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

不是答案:只是建议。 了解如何使用 python 调试器。

python -m pdb <pythonscript.py>

在本例中,在第 9 行设置断点

b 9

运行程序

c

当它坏了,看看temp2

p temp2

它告诉你

['FullTime']

看var1

p var1

它告诉你

'FullTime'

这就是你的问题。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM