2017-09-02 43 views
-1

我正在编写学校作业的程序,我必须使用.csv文件中的数据。当我打开文件时,我读取它,并将其保留为未格式化(所有项目均为字符串)。我只用逗号分开它们并在列表中创建列表。我需要找到列表中的最后一个项目(有3个列表与最后一个项目相同)。它在我的邮件程序中不起作用,所以我使用python shell来确认是否有错误。列表中的最后一项不计算

>>> l=[['2', '13:00', '22', '0', 'True', '5\n'], ['-1', '14:00', '22', '0', 'True', '5\n'], ['2', '15:00', '23', '0', 'True', '5\n']] 
>>> "5\n" in l 
False 
>>> "5" in l 
False 
>>> 

这是它给我的回应。为什么没有看到最后一个项目?为什么有这种不需要的“新行”字符?格式化的版本显示为5(整数),因此它显然存在。

+0

这不是列表中的项目。这是列表中项目的一个项目。 – user2357112

+0

它没有看到任何项目。 l'中的'2'也不起作用。 –

+0

'in'不是可传递的。 – user2357112

回答

2

你的测试将工作对于任何子项目,例如:

>>> '2' in l 
False 

x in y检查直接会员。所以它应该工作,如果你会问:

>>> ['2', '13:00', '22', '0', 'True', '5\n'] in l 
True 

如果你想检查级别的会员,您可以使用:

any("5\n" in li for li in l) 

这是True

>>> any("5\n" in li for li in l) 
True 
0

您有清单列表。这意味着您必须先索引父列表,然后才能检查项目是否在子列表中。

'5\n' in l[2] 

l[2]访问第3项(因为索引是从0开始在Python)在列表中。第三项本身就是一个清单,然后你可以到in检查。

如果您希望能轻松地在列表清单上执行in检查,那么您的运气不好。你需要编写一个循环遍历父列表中的每个项目,然后检查每个子列表中的in,直到找到匹配项。

found = False # track whether we found something or not 
for child in l: 
    if '5\n' in child: 
     found = True 
     break # we found it, no need to keep looping 

if found: 
    # if we found something, do something 
+0

'l [3]'访问列表中的第四个*项,而不是第三个。 – cdarke

+0

@cdarke谢谢,我很匆忙和错误的计数。 – Soviut

1

如果你希望所有过去的项目列表,你可以做一个简单的列表理解:

last_items = [m[-1] for m in l] 

演示:

>>> last_items = [m[-1] for m in l] 

>>> last_items 
['5\n', '5\n', '5\n'] 
+1

清洁,简单的解决方案。如果OP只需要知道他们的存在,那么你可以在任何(m [-1] =='5 \ n'为m中的l')或者在每个子列表中存在:'[m [ - [ 1] =='5 \ n'for m in l]',或for all sublists:'all(m [-1] =='5 \ n'for m in l)':-) –

+0

谢谢您添加那! :) –

0
m=list(zip(*l)[-1]) # last column 
if "5\n" in m: 
     ...     
+0

这不提供问题的答案。要批评或要求作者澄清,请在其帖子下方留言。 - [来自评论](/ review/low-quality-posts/17218842) –

相关问题