2012-04-16 244 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]) + '}'