打印同一索引中重复出现的所有子列表

Printing all sublists with a reoccurring item in the same index

Data = [ [0, 'Dev', 'Test1', 0, 0], [0, 'Dev', 'Test2', 0, 0], [0, 'Dev', 'Test3', 0, 0]
          ]

loop = 1
while loop == 1:
#There Is more than one user, they can only see their data
    print ('type name of User')
    User = str(input())

这就是问题所在。挑战在于打印出在第一个索引中使用的用户的每一次出现。

try:
    YP = (Data[[value[1] for value in Data].index(User)][2])
    print ('|['+User+'][', YP)
except ValueError:
    print ('No Data')
                

我们想要这样的输出,使用 Dev:

|[Dev][ Test 1
|[Dev][ Test 2
|[Dev][ Test 3

并且我们想要使用其他名称的输出:

No Data

但是当为这个其他名称输入新数据时:

|[Ck][ Hello
|[Ck][ Konichiwa
|[Ck][ Bonjour  

这是输入新数据的方式:

print ('Type = New Data')
NewData = str(input())

PID = len(Data)
PID = (PID - 1)
PID = Data[PID] [0]
PID = (PID + 1)
Data.append([PID, User, NewData, 0, 0])
print (Data)
YP = (Data[[value[1] for value in Data].index(User)][2])

index() 只有 returns 1 个值,它找到的第一个值,所以这一行只会给你 1 个值。由于要打印所有值,因此确实需要一个 for 循环。

这一行也很难读懂,因为它试图同时做很多事情。不要害怕使用更多的代码行,因为它通常会增加代码的可读性。

我要做的第一件事是过滤初始数据以仅获取用户的记录:

UserData = list(filter(lambda x: x[1] == User, Data)) 

这个 returns 与数据相同的列表,但只有索引 1 等于我们的用户的记录。如果你正在使用 Python 2,list(...) 是不必要的,因为 filter() 已经是 returns 一个列表。但是在 Python 3 它 returns 一个过滤器对象,我们确实需要将它转换为一个列表。

如果这个新列表没有元素,则没有用户的数据。如果它有一些元素,我们遍历它们并打印它们:

if len(UserData) > 0:
    for data in UserData:
        value = data[2]
        print(f'][{User}][ {value}')
else:
    print('No data')

检查过滤列表的长度以了解我们是否有数据比依赖异常为我们做这件事更干净。这里我使用 f-strings 来打印数据。如果您觉得更舒服,也可以使用更传统的 format() 函数:

print('][{}][ {}'.format(User, value))

完整代码如下:

UserData = list(filter(lambda x: x[1] == User, Data))

if len(UserData) > 0:
    for data in UserData:
        value = data[2]
        print(f'][{User}][ {value}')
else:
    print('No data')