簡體   English   中英

根據通用ID將元組列表中的項目分組

[英]Group items in a list of tuples based on a common ID

我有一個很大的同義詞集(10000+)作為元組列表,看起來像這樣:

data = [
    (435347,'cat'),
    (435347,'feline'),
    (435347,'lion'),
    (6765756,'dog'),
    (6765756,'hound'),
    (6765756,'puppy'),
    (435347,'kitten'),
    (987977,'frog')
]

其中每個同義詞是由任意的共享ID標識,在此情況下4353476765756 ,和987977

我想編寫一個使數據看起來像這樣的函數:

processed_data = [
    (435347,'cat','feline','lion','kitten'),
    (6765756,'dog','hound','puppy'),
    (987977,'frog')
]

任何建議,不勝感激!

嘗試這個:

groups = {}

for x, y in data:
    group = groups.get(x, [])
    group.append(y)
    groups[x] = group

print(groups)

輸出:

{987977: ['frog'], 435347: ['cat', 'feline', 'lion', 'kitten'], 6765756: ['dog', 'hound', 'puppy']}
dictionary = {}
for val in data:
    id_, name = val
    if id_ in dictionary:
        dictionary[id_].append(name)
    else:
        dictionary[id_] = [id_, name]
print(list(dictionary.values()))
>>> [[435347, 'cat', 'feline', 'lion', 'kitten'], [6765756, 'dog', 'hound', 'puppy'], [987977, 'frog']]

您可以嘗試以下一種方法:

data = [(435347,'cat'),(435347,'feline'),(435347,'lion'),(6765756,'dog'),(6765756,'hound'),(6765756,'puppy'),(435347,'kitten'),(987977,'frog')]

dataset = set(i[0] for i in data)
processed_data = sorted([(tuple([i]) + tuple(j[1] for j in data if j[0]==i)) for i in dataset])
print(processed_data)

輸出:

[(435347, 'cat', 'feline', 'lion', 'kitten'), (987977, 'frog'), (6765756, 'dog', 'hound', 'puppy')]

這是另一種方法,是對另一個問題的回答的修改。 您可以使用reducemap實現此目的:

def reducer(x, y):
    if isinstance(x, dict):
        ykey, yval = y
        if ykey not in x:
            x[ykey] = [yval]
        else:
            x[ykey] += [yval]
        return x
    else:
        xkey, xval = x
        ykey, yval = y
        a = {xkey: [xval]}
        if ykey in a:
            a[ykey] += [yval]
        else:
            a[ykey] = [yval]
        return a

processed_data = map(lambda x: (x[0],) + tuple(x[1]), reduce(reducer, data).items())

輸出:

>>> print processed_data
[(987977, 'frog'),
 (435347, 'cat', 'feline', 'lion', 'kitten'),
 (6765756, 'dog', 'hound', 'puppy')]

說明

逐步分解:

reducer()函數通過關鍵字將項分組到字典中。 詞典的值是一個列表,該列表后附加同義詞值。

>>> print(reduce(reducer, data))
{435347: ['cat', 'feline', 'lion', 'kitten'],
 987977: ['frog'],
 6765756: ['dog', 'hound', 'puppy']}

我們在reduce()函數的輸出上調用.items() ,以將其作為tuples列表獲取:

>>> print(reduce(reducer, data).items())
[(987977, ['frog']),
 (435347, ['cat', 'feline', 'lion', 'kitten']),
 (6765756, ['dog', 'hound', 'puppy'])]

最后,我們調用map()將輸出轉換為所需的形式。

字典可能是更適合您的問題的解決方案:

data = [(435347,'cat'),(435347,'feline'),(435347,'lion'),(6765756,'dog'),(6765756,'hound'),(6765756,'puppy'),(435347,'kitten'),(987977,'frog')]
results = {}
for key, item in data:
    results.setdefault(key,[]).append(item)

輸出:

{435347: ['cat', 'feline', 'lion', 'kitten'],
 987977: ['frog'],
 6765756: ['dog', 'hound', 'puppy']}

setdefault適合您的情況。 如果鍵不存在,則基本上創建一個字典條目,如果鍵存在,則追加到條目。

有很多方法,其中一些是:

數據是:

data = [
    (435347,'cat'),
    (435347,'feline'),
    (435347,'lion'),
    (6765756,'dog'),
    (6765756,'hound'),
    (6765756,'puppy'),
    (435347,'kitten'),
    (987977,'frog')
]

Itertools groupby:

from itertools import groupby

print([tuple(i) for j,i in groupby(sorted(data),key=lambda x:x[0])])

集合默認字典:

from collections import defaultdict

d=defaultdict(list)
for i in data:
    d[i[0]].append(i)

print(d)

沒有任何模塊:

without_module={}
for i in data:
    if i[0] not in without_module:
        without_module[i[0]]=[i]
    else:
        without_module[i[0]].append(i)
print(without_module)

好吧,這是一個建議,所以如果錯了,請不要生氣-

因此,請嘗試創建輸入並創建for語句,然后使其從.txt文件或您喜歡的文件中讀取數據。 並在for下方創建一個if語句。

碼:

animal=input("Animal: ")
f=open("animal.txt")
for line in f:
    if genre in line.strip():
        print(line)

會親自提出建議,並將數據全部整理成陣列並執行\\ n

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM