python处理文本信息
巴扎黑
巴扎黑 2017-04-17 17:50:50
0
1
283

有一个文本信息如下:

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]

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

巴扎黑
巴扎黑

répondre à tous(1)
迷茫

Il est possible d'utiliser un dictionnaire, collectez d'abord :

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])

Sortie :

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

ou :

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

Parlez-moi un peu de ce code :

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

La ligne ci-dessus est une expression génératrice (genexp en abrégé). Elle est similaire à la compréhension de liste, mais elle ne générera pas de données réelles et de listes immédiatement. Elle attendra seulement que vous parcouriez ou obteniez la valeur des éléments de données. générés séquentiellement. Cela signifie que l’utilisation des ressources est relativement efficace.

Le générateur généré ici peut générer un tuple à deux éléments en séquence. Les deux éléments sont des identifiants, qui sont exactement une paire d'identifiants (le premier élément est chaque identifiant non-dernier et le deuxième élément est le dernier. id.

Quant à :

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

consiste à générer des paires d'identifiants en séquence et à utiliser le déballage de tuples pour attribuer des valeurs à sid et eid en parallèle, et enfin à la sortie.


data :

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

Résultat :

453926 419809
425967 419809
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal