2012-04-16 246 views
-3

我正在使用Python 2.6的小型项目。最后我的清单是这样的。如何实现这个结果

data = ['1:Rammmm,mmmm', '2:surr.rrrrr', '3:Sam ttttt', 
'1:qqqq qqqqqqq', '2:wwwwwwwwwww', '3:eeeeeeeee','4:tttttttt', 
'1:zzzzzzzzzzzzz', '2:xxxxxxxxx'] 

在这里,我想用管道“|”在一行中显示全部1,在一行中全部显示2,等等。作为分隔符。它应该是这样的,只按数字排序。

{Rammmm,mmmm|qqqq qqqqqqq|zzzzzzzzzzzzz} 
{surr.rrrrr|wwwwwwwwwww|xxxxxxxxx} 
{Sam ttttt|eeeeeeeee} 
{tttttttt} 

这怎么能在Python中实现?

回答

3

看我其他的解决方案,因为我相信这是比这更好的一个: https://stackoverflow.com/a/10173807/1219006

>>> from operator import itemgetter 
>>> from itertools import groupby 
>>> data = ['1:Rammmm,mmmm', '2:surr.rrrrr', '3:Sam ttttt', 
'1:qqqq qqqqqqq', '2:wwwwwwwwwww', '3:eeeeeeeee','4:tttttttt', 
'1:zzzzzzzzzzzzz', '2:xxxxxxxxx'] 
>>> sorted_data = sorted(((int(x),y) for x,y in (el.split(':') for el in data)),key=itemgetter(0)) 
>>> for k,v in groupby(sorted_data,key=itemgetter(0)): 
     print '{' + '|'.join(text for num,text in v) + '}' 


{Rammmm,mmmm|qqqq qqqqqqq|zzzzzzzzzzzzz} 
{surr.rrrrr|wwwwwwwwwww|xxxxxxxxx} 
{Sam ttttt|eeeeeeeee} 
{tttttttt} 

测试

>>> data = ['1:Rameshrrrrrrr', '2:Sureshmmmmmm', '3:Samkkkkkkkk', '1:tttttttttt', '2:wwwwwwwwwwwwwwwww', '3:yyyyyyyyy', '4:gggggggggg', '1:qqqqqqqqqqq', '2:hhhhhhhhh'] 
>>> sorted_data = sorted(((int(x),y) for x,y in (el.split(':') for el in data)),key=itemgetter(0)) 
>>> for k,v in groupby(sorted_data,key=itemgetter(0)): 
     print '{' + '|'.join(text for num,text in v) + '}' 


{Rameshrrrrrrr|tttttttttt|qqqqqqqqqqq} 
{Sureshmmmmmm|wwwwwwwwwwwwwwwww|hhhhhhhhh} 
{Samkkkkkkkk|yyyyyyyyy} 
{gggggggggg} 
+0

这是完美的工作。但排序应该是numbers.all 1的第一,所有2的第二,然后3's.But不是文本例如:{Sam ttttt | eeeeeeeee} 我想要这样,但上面的代码排序文本也(我不想) 请纠正这是我的mailid: [email protected] – user1335606 2012-04-16 07:49:37

+0

好吧,我添加了'key = itemgetter(0)'到'sorted'函数,所以现在它只按数字排序。 – jamylak 2012-04-16 08:01:31

+0

list = ['1:Rameshrrrrrrr','2:Sureshmmmmmm','3:Samkkkkkkkk','1:tttttttttt','2:wwwwwwwwwwwwwwwww','3:yyyyyyyyy','4:gggggggggg','1:qqqqqqqqqqq ','2:hhhhhhhhh'] 删除了“key = itemgetter(0)”,并且还尝试了它的排序文本,我想要这样的东西。 {Rameshrrrrrrr | tttttttttt | qqqqqqqqqqq} { Sureshmmmmmm | wwwwwwwwwwwwwwwww | hhhhhhhhh} { Samkkkkkkkk | YYYYYYYYY} – user1335606 2012-04-16 08:19:46

0

你将需要:

  • 的一种方式分裂将每个字符串分为数字部分和另一部分

  • 与数部分转换为整数

  • 收集所有的各个部分的一种方法的一种方式。您需要具有相同编号部分的所有其他部分的列表。

  • 遍历列表中的所有字符串并收集所有内容。

  • 一种将其他部分连接在一起以获得最终结果的方法。

找出你可以在Python做什么好办法就是去Python提示符,然后输入help(something)。将“某物”替换为您想要的帮助。试试这些:

help(str.split)

help(str.join)

我会建议你转换为整数通过调用int()。像这样:

x = "3" 
n = int(x) # n is now the integer value 3 

而且我建议你考虑使用dict来收集东西。每个字母键您将有多个值...您需要将它们连接在一起,在dict中,或者为dict中的每一个创建某种列表。

祝你好运!

0
#!/usr/bin/python 

l = ['1:Rammmm,mmmm', '2:surr.rrrrr', '3:Sam ttttt', '1:qqqq qqqqqqq', '2:wwwwwwwwwww', 3:eeeeeeeee','4:tttttttt', '1:zzzzzzzzzzzzz', '2:xxxxxxxxx'] 

l = [ x.split(':') for x in l ] 

d ={} 
for k, v in l: 
    try: 
    d[k] 
    except: 
    d[k] = [] 
    d[k].append(v) 

l = d.values() 
l = [ "|".join(x) for x in l ] 
+0

而不是尝试:d [k],你应该使用'defaultdict'。字典也是无序的,所以你的输出可能是正确的,也可能不正确。 – jamylak 2012-04-16 06:49:53

0

我觉得这是做

>>> from collections import defaultdict 
>>> data = ['1:Rammmm,mmmm', '2:surr.rrrrr', '3:Sam ttttt', 
'1:qqqq qqqqqqq', '2:wwwwwwwwwww', '3:eeeeeeeee','4:tttttttt', 
'1:zzzzzzzzzzzzz', '2:xxxxxxxxx'] 
>>> d = defaultdict(list) 
>>> for num, text in (el.split(':') for el in data): 
     d[int(num)].append(text) 


>>> for key in sorted(d): 
     print '{' + '|'.join(d[key]) + '}' 


{Rammmm,mmmm|qqqq qqqqqqq|zzzzzzzzzzzzz} 
{surr.rrrrr|wwwwwwwwwww|xxxxxxxxx} 
{Sam ttttt|eeeeeeeee} 
{tttttttt} 
0

一个更好的办法,我们可以获取的愿望输出这样做:

​​
+0

这只适用于有一位数字的情况。另外'set'是无序的,所以这可能会或可能不会产生正确的输出。 – jamylak 2012-04-16 14:24:02

0

可能是这样的变体甚至会simplier:

data = ['1:Rammmm,mmmm', '2:surr.rrrrr', '3:Sam ttttt', 
     '1:qqqq qqqqqqq', '2:wwwwwwwwwww', '3:eeeeeeeee','4:tttttttt', 
     '1:zzzzzzzzzzzzz', '2:xxxxxxxxx'] 

d = dict() 
for item in data: 
    k, v = item.split(':') 
    # if d already has list at key 'k', append to it; 
    # otherwise, create list, and append to newly created 
    d.setdefault(k,list()).append(v) 

# now print formatted list in order of sorted keys (1,2,3,4) 
for k in sorted(d.keys()): 
    print '{' + '|'.join(d[k]) + '}'