Найти подходящие элементы в одном массиве

Python 3.6.0 Timings

Вот результаты синхронизации с использованием Python 3.6.0. Имейте в виду, что эти времена относятся друг к другу, а не абсолютны.

Я придерживался только мелких копий, а также добавил некоторые новые методы, которые не были возможны в Python2, например list.copy() ( Python3 эквивалент среза ) и распаковки (*new_list, = list):

METHOD                  TIME TAKEN
b = a[:]                6.468942025996512   #Python2 winner
b = a.copy()            6.986593422974693   #Python3 "slice equivalent"
b = []; b.extend(a)     7.309216841997113
b = a[0:len(a)]         10.916740721993847
*b, = a                 11.046738261007704
b = list(a)             11.761539687984623
b = [i for i in a]      24.66165203397395
b = copy.copy(a)        30.853400873980718
b = []
for item in a:
  b.append(item)        48.19176080400939

Мы видим, что старый победитель по-прежнему выходит сверху, но на самом деле не на огромную сумму, учитывая повышенную читаемость подхода Python3 list.copy().

Обратите внимание, что эти методы делают not выводными эквивалентными результатами для любого ввода, отличного от списков. Все они работают для разрезаемых объектов, некоторые работы для любого итерабельного, но только copy.copy() работает для любого объекта Python.


Вот код тестирования для заинтересованных сторон ( Шаблон отсюда ):

import timeit

COUNT = 50000000
print("Array duplicating. Tests run", COUNT, "times")
setup = 'a = [0,1,2,3,4,5,6,7,8,9]; import copy'

print("b = list(a)\t\t", timeit.timeit(stmt='b = list(a)', setup=setup, number=COUNT))
print("b = copy.copy(a)\t\t", timeit.timeit(stmt='b = copy.copy(a)', setup=setup, number=COUNT))
print("b = a.copy()\t\t", timeit.timeit(stmt='b = a.copy()', setup=setup, number=COUNT))
print("b = a[:]\t\t", timeit.timeit(stmt='b = a[:]', setup=setup, number=COUNT))
print("b = a[0:len(a)]\t", timeit.timeit(stmt='b = a[0:len(a)]', setup=setup, number=COUNT))
print("*b, = a\t", timeit.timeit(stmt='*b, = a', setup=setup, number=COUNT))
print("b = []; b.extend(a)\t", timeit.timeit(stmt='b = []; b.extend(a)', setup=setup, number=COUNT))
print("b = []\nfor item in a: b.append(item)\t", timeit.timeit(stmt='b = []\nfor item in a:  b.append(item)', setup=setup, number=COUNT))
print("b = [i for i in a]\t", timeit.timeit(stmt='b = [i for i in a]', setup=setup, number=COUNT))

0
задан U9-Forward 24 March 2019 в 04:37
поделиться

3 ответа

Вы можете использовать словарь , чтобы сначала сохранить, сколько раз идентификатор встречается в списке. Затем вы можете отфильтровать свой исходный список на основе того, является ли идентификатор дубликатом:

bidders = [
    Bidder(11, 8, 'BID', 430, 0.20),
    Bidder(13, 13, 'BID', 430, 0.15),
    Bidder(17, 8, 'BID', 430, 0.10),
    Bidder(18, 1, 'BID', 431, 0.15),
    Bidder(19, 3, 'BID', 431, 0.14),
    Bidder(21, 3, 'BID', 431, 0.14)
]

id_counts = {}
for b in bidders:
    if b.user_id in id_counts:
        id_counts[b.user_id] += 1
    else:
        id_counts[b.user_id] = 1

result = [b for b in bidders if id_counts[b.user_id] > 1]
print(result)

Вывод

[Timestamp: 11, User Id: 8, Action: BID, Loan ID: 430, Rate: 0.2,
 Timestamp: 17, User Id: 8, Action: BID, Loan ID: 430, Rate: 0.1,
 Timestamp: 19, User Id: 3, Action: BID, Loan ID: 431, Rate: 0.14,
 Timestamp: 21, User Id: 3, Action: BID, Loan ID: 431, Rate: 0.14]
0
ответ дан slider 24 March 2019 в 04:37
поделиться

Попробуйте, цикл for:

data = ['Bidder - Timestamp: 11, User ID: 8, Action: BID, Loan ID: 430, Rate: 0.20',
        'Bidder - Timestamp: 13, User ID: 13, Action: BID, Loan ID: 430, Rate: 0.15',
        'Bidder - Timestamp: 17, User ID: 8, Action: BID, Loan ID: 430, Rate: 0.10',
        'Bidder - Timestamp: 18, User ID: 1, Action: BID, Loan ID: 431, Rate: 0.15',
        'Bidder - Timestamp: 19, User ID: 3, Action: BID, Loan ID: 431, Rate: 0.14',
        'Bidder - Timestamp: 21, User ID: 3, Action: BID, Loan ID: 431, Rate: 0.14']
l = [[i.split(':')[0].strip() for i in data[0].split(',')]]
for i in data:
    l.append([x.split(':')[1].strip() for x in i.split(',')])

Или понимание списка из одной строки:

data = ['Bidder - Timestamp: 11, User ID: 8, Action: BID, Loan ID: 430, Rate: 0.20',
        'Bidder - Timestamp: 13, User ID: 13, Action: BID, Loan ID: 430, Rate: 0.15',
        'Bidder - Timestamp: 17, User ID: 8, Action: BID, Loan ID: 430, Rate: 0.10',
        'Bidder - Timestamp: 18, User ID: 1, Action: BID, Loan ID: 431, Rate: 0.15',
        'Bidder - Timestamp: 19, User ID: 3, Action: BID, Loan ID: 431, Rate: 0.14',
        'Bidder - Timestamp: 21, User ID: 3, Action: BID, Loan ID: 431, Rate: 0.14']
l = [[i.split(':')[0].strip() for i in data[0].split(',')]] + [[x.split(':')[1].strip() for x in i.split(',')] for i in data]
0
ответ дан U9-Forward 24 March 2019 в 04:37
поделиться

Вот метод для преобразования вашего списка объектов в фрейм данных, из которого вы сможете легко найти совпадения:

# Create a list of lists
data = ['Bidder - Timestamp: 11, User ID: 8, Action: BID, Loan ID: 430, Rate: 0.20',
        'Bidder - Timestamp: 13, User ID: 13, Action: BID, Loan ID: 430, Rate: 0.15',
        'Bidder - Timestamp: 17, User ID: 8, Action: BID, Loan ID: 430, Rate: 0.10',
        'Bidder - Timestamp: 18, User ID: 1, Action: BID, Loan ID: 431, Rate: 0.15',
        'Bidder - Timestamp: 19, User ID: 3, Action: BID, Loan ID: 431, Rate: 0.14',
        'Bidder - Timestamp: 21, User ID: 3, Action: BID, Loan ID: 431, Rate: 0.14']

df = pd.DataFrame([d.split(',') for d in data])
# df = pd.DataFrame([list(d).split(',') for d in data]) # Use this for your list of objects

df2 = pd.DataFrame()
for i in range(len(df.columns)):
    name = df.iloc[:,i].str.split(':', expand=True)[0][0].strip()
    values = df.iloc[:,i].str.split(':', expand=True)[1].str.strip()
    df2[name] = values

print(df2)
  Bidder - Timestamp User ID Action Loan ID  Rate
0                 11       8    BID     430  0.20
1                 13      13    BID     430  0.15
2                 17       8    BID     430  0.10
3                 18       1    BID     431  0.15
4                 19       3    BID     431  0.14
5                 21       3    BID     431  0.14
# Find matches
df2[df2['User ID'] == '8']
  Bidder - Timestamp User ID Action Loan ID  Rate
0                 11       8    BID     430  0.20
2                 17       8    BID     430  0.10
0
ответ дан Nathaniel 24 March 2019 в 04:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: