2017-05-16 39 views
-2

我是Python新手。 我想打印列表中的元素,而不是以特定格式重复:{“id”:value}。 这是我的代码。Python - 带打印功能的错误输出

d =['l','o','u','l','b','l','a'] 

for item in range(0,len(d)): 
    prev=item-1 
    if item==0: 
    print(" {\"id\": \"" + (d[item]) + "\"} ,") 
    continue 
    if (d[item]==d[prev])or(d[item] in d[:prev]): 
    continue 
    else: 
    print(" {\"id\": \"" + (d[item]) + "\"}"), 
    if (item==(len(d))): #if last element, print ".", else print "," 
     print(".\n"), 
    else: 
     print(",\n"), 

结果应该是:

{"id": "l"} , 
    {"id": "o"} , 
    {"id": "u"} , 
    {"id": "b"} , 
    {"id": "a"} . 

但输出是:

{"id": "l"} , 
    {"id": "o"} , 
    {"id": "u"} , 
    {"id": "b"} , 
    {"id": "a"} , 

我的代码工作很好,直到最后一行。它以“,”而不是“。”结尾。 请帮我

回答

1

尝试if (item==len(d)-1):

的最后一个项目的索引LEN(d)-1。

顺便说一句,有比较容易的方式方法使用set()来删除重复的名单:

list(set(['a', 'a', 'b']))将返回['a','b']

警告:如果您使用set()你将失去​​该项目的顺序。如果您想保留订单,请参见How do you remove duplicates from a list in whilst preserving order?

+0

谢谢。有用。但如果我将列表编辑为d = ['l','o','u','l','b','l'],那么它不起作用。我的代码中有没有错误? –

+0

这是因为你没有输入'else'子句。 '如果d [item] == d [prev])或(d [:prev]中的d [item]):'返回true,因为您已经看到'l'。 – mcb

+0

我们有其他方法吗?由于一些进一步的问题,这个列表应该保留原来的,而不是删除里面的任何元素。 –

0

在Python中,范围(0,N)函数返回从0到N-1的数字。 在你的情况下,你已经使用了N = len(d),所以你应该相应地改变if语句。 Try:

if (item==(len(d)-1)): #if last element, print ".", else print "," 
    print(".\n") 

取而代之。

完全跑步代码应该是这样的:

d =['l','o','u','l','b','l','a'] 
for item_id, item in enumerate(set(d)): 
    if item_id != (len(d) - 1): 
    print(" {\"id\": \"" + item + "\"} ,") 
    else: 
    print(" {\"id\": \"" + item + "\"} .") 
+0

谢谢。有用。但如果我将列表编辑为d = ['l','o','u','l','b','l'],那么它不起作用。我的代码中有没有错误? –

+0

我编辑了我的回复以包含完整的工作版本 –

+0

p.s.如果你能够回答你的问题并接受答案,那就太好了。 –

0

if (item==(len(d)))代码将永远不会打这个块,因为 项目只能去高达len(d)-1

d =['l','o','u','l','b','l','a'] 

for item in range(0,len(d)): 
    prev=item-1 
    if item==0: 
    print(" {\"id\": \"" + (d[item]) + "\"} ,") 
    continue 
    if (d[item]==d[prev])or(d[item] in d[:prev]): 
    continue 
    else: 
    print(" {\"id\": \"" + (d[item]) + "\"}"), 
    if (item!=(len(d))-1): #if last element, print ".", else print "," 
     print(",\n"), 
print(".\n") 

使用套:

d =['l','o','u','l','b','l','a'] 
d = list(set(d)) 
for item in range(0,len(d)): 
    print(" {\"id\": \"" + (d[item]) + "\"}"), 
    if (item!=(len(d))-1): #if last element, print ".", else print "," 
     print(",\n"), 
print(".\n") 
+0

谢谢,它的工作原理。 但是,如果我将列表编辑为d = ['l','o','u','l','b','l'],则不起作用。我的代码中有任何错误吗? –

+0

这不会起作用,因为你有'if(d [item] == d [prev])或(d [:prev]中的d [item]):continue',这将跳过这个检查。 – Pavan

+0

我编辑了你提出的问题的代码,但是使用python设置别人指出的是减少代码大小的好方法。 – Pavan

0

As range是排他性的,range(0,len(d))将有从0值LEN(d) - 1,所以,你的if语句应该是 -

if item == (len(d) - 1): 
    print(".\n") 

如果在列表的最后一个元素是重复的,最好是打造一个集。请尝试以下内容 -

d = {'l','o','u','l','b','l'} 

for i, e in enumerate(d): 
    print(" {\"id\": \"" + (e) + "\"}"), 
    if i == len(d) - 1: 
     print(".\n") 
    else: 
     print(",\n") 

这里,d = {'l','o','u','l','b','l'}创建一个删除重复元素的集合。那么你可以简单地迭代它

+0

谢谢,它的工作原理。 但是,如果我将列表编辑为d = ['l','o','u','l','b','l'],则不起作用。我的代码中有任何错误吗? –

+0

因为最后一个元素'l'是重复的。最好的解决方案是制作一个集合并遍历它 – kuro

+0

输出是正确的,但不是按顺序。我们仍然可以保持列表的顺序吗? –