搜尋

首頁  >  問答  >  主體

python处理文本信息

有一个文本信息如下:

42 453926 Stormwriter restored undeleted 61.1.28.140
44 425968 61.1.28.140
42 425967 Mintguy restored undeleted 61.11.252.22
43 419840 61.11.252.22

我做的是需要根据第一列的这个序号的数据来找对应的数据,像这种有着相同序号的行,他们对应的第二列的ID数据就是对应的,我需要找到这样一对一对的 ID 数据。就这个例子来说就是 453926 跟 425967 是对应的,输出:

453926 425967

而也会有多个相同序号的情况。比如:

42 453926 Stormwriter restored undeleted 61.1.28.140
44 425968 61.1.28.140
42 425967 Mintguy restored undeleted 61.11.252.22
43 419840 61.11.252.22
42 419809 TimStarling

就是需要记录多次,而且是跟最后一个相同序号对应,拿这个例子来说,就是记录第一个42跟最后一个42的对应ID,然后同时也要记录中间那个 42 跟最后一个 42 的 ID,输出这样:

453926 419809(restored行的ID是453926)
425967 419809(restored行的ID是425967)

我开始想的是用字典,但是字典也就只能保留到最后一个相同的序号,怎么做才能让中间的相同序号也能输出对应的呢TUT

我的伪代码如下:

dict={}
if xxx: #只是一个判断处理的条件
   flag_number =line.split()[0]
   id = line.split()[0]
   next()
elif line.split()[0]==flag_number:
   dict[id]=line.split()[1]

但是这个代码只能输出第一个跟最后一个相同的序号,如何修改才能也让中间的相同序号跟最后一个序号也输出出来呢

巴扎黑巴扎黑2889 天前292

全部回覆(1)我來回復

  • 迷茫

    迷茫2017-04-17 17:52:50

    用字典是可以的,首先是收集:

    INDEX = 0
    ID = 1
    
    dic = {}
    
    with open('data') as reader:
        for line in reader:
            items = line.strip().split()
            ids = dic.setdefault(items[INDEX], [])
            ids.append(items[ID])

    輸出:

    for index, ids in dic.items():
        for sid in ids[0:-1]:
            print sid, ids[-1]

    或:

    # 如果不太懂這段代碼的意思,請參見下面說明,其實我覺得用上面的方法也夠了
    for index, ids in dic.items():
        for sid, eid in ((id, ids[-1]) for id in ids[0:-1]):
            print sid, eid

    稍微講一下這段程式碼:

    ((id, ids[-1]) for id in ids[0:-1])

    上面這一行是一個產生器表達式( generator expression, 簡稱genexp),他就類似list comprehension,不過他並不會馬上產生實際的資料和list,只有等到你去iterate 或是取值的時候才會依序產生資料項。這代表在資源的利用上,是比較有效率的。

    這邊產生的generator 可以依序產生一個雙元素的tuple,這兩個元素都是id,剛好就是一個id pair(第一個元素是各個非最後一個id,第二個元素是最後一個id。

    至於:

    for sid, eid in ((id, ids[-1]) for id in ids[0:-1]):

    就是依序產生 id pair 並且利用 tuple unpacking 平行賦值給 sideid,最後輸出。


    sideid,最後輸出。


    datadata:

    42 453926 Stormwriter restored undeleted 61.1.28.140
    44 425968 61.1.28.140
    42 425967 Mintguy restored undeleted 61.11.252.22
    43 419840 61.11.252.22
    42 419809 TimStarling

    結果:

    453926 419809
    425967 419809

    回覆
    0
  • 取消回覆