Вот результаты синхронизации с использованием 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))
Вы можете использовать словарь , чтобы сначала сохранить, сколько раз идентификатор встречается в списке. Затем вы можете отфильтровать свой исходный список на основе того, является ли идентификатор дубликатом:
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]
Попробуйте, цикл 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]
Вот метод для преобразования вашего списка объектов в фрейм данных, из которого вы сможете легко найти совпадения:
# 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