[英]How to split all combinations of two lists N times cleaner?
如果問題的標題令人困惑,請原諒。 我想不出更好的措辭了。 無論如何,我有一個Python程序,該程序接受名字列表和姓氏列表。 然后,將兩者“拆分”為所有組合,最多可獲得5個結果。 該代碼對其進行了更好的解釋:
def getLists(firstNames, lastNames, resultCount):
firstNameCount = len(firstNames)
lastNameCount = len(lastNames)
if firstNameCount >= resultCount:
# Return the last name list as is.
return [firstNames[i * firstNameCount / resultCount:(i + 1) * firstNameCount / resultCount] for i in xrange(resultCount)], [lastNames for _ in xrange(resultCount)]
else:
lastNameLists = []
firstNameLists = [[firstNames[i % firstNameCount]] for i in xrange(resultCount)]
for i in xrange(resultCount):
firstName = firstNameLists[i]
total = firstNameLists.count(firstName)
already = total - firstNameLists[i:].count(firstName)
lastNameLists.append(lastNames[already * lastNameCount / total:(already + 1) * lastNameCount / total])
# Return the last names, split depending on how many results and first names.
return firstNameLists, lastNameLists
如果名字少於最大值(5),則重復名字,直到最大值和姓氏分配在名字之間:
firstNames = ['firstName{}'.format(i) for i in xrange(1, 3)]
lastNames = ['lastName{}'.format(i) for i in xrange(1, 8)]
comboCount = len(firstNames) * len(lastNames)
resultCount = min(comboCount, 5)
firstNameLists, lastNameLists = getLists(firstNames, lastNames, resultCount)
for i in xrange(resultCount):
print 'Result #{}:\nFirst Names: {}\nLast Names: {}'.format(i + 1, firstNameLists[i], lastNameLists[i])
print
輸出:
Result #1:
First Names: ['firstName1']
Last Names: ['lastName1', 'lastName2']
Result #2:
First Names: ['firstName2']
Last Names: ['lastName1', 'lastName2', 'lastName3']
Result #3:
First Names: ['firstName1']
Last Names: ['lastName3', 'lastName4']
Result #4:
First Names: ['firstName2']
Last Names: ['lastName4', 'lastName5', 'lastName6', 'lastName7']
Result #5:
First Names: ['firstName1']
Last Names: ['lastName5', 'lastName6', 'lastName7']
如果名字多於最大值(5),則名字將盡可能均勻地分布,並為每個名字復制姓氏:
firstNames = ['firstName{}'.format(i) for i in xrange(1, 8)]
lastNames = ['lastName{}'.format(i) for i in xrange(1, 8)]
comboCount = len(firstNames) * len(lastNames)
resultCount = min(comboCount, 5)
firstNameLists, lastNameLists = getLists(firstNames, lastNames, resultCount)
for i in xrange(resultCount):
print 'Result #{}:\nFirst Names: {}\nLast Names: {}'.format(i + 1, firstNameLists[i], lastNameLists[i])
print
輸出:
Result #1:
First Names: ['firstName1']
Last Names: ['lastName1', 'lastName2', 'lastName3', 'lastName4', 'lastName5', 'lastName6', 'lastName7']
Result #2:
First Names: ['firstName2']
Last Names: ['lastName1', 'lastName2', 'lastName3', 'lastName4', 'lastName5', 'lastName6', 'lastName7']
Result #3:
First Names: ['firstName3', 'firstName4']
Last Names: ['lastName1', 'lastName2', 'lastName3', 'lastName4', 'lastName5', 'lastName6', 'lastName7']
Result #4:
First Names: ['firstName5']
Last Names: ['lastName1', 'lastName2', 'lastName3', 'lastName4', 'lastName5', 'lastName6', 'lastName7']
Result #5:
First Names: ['firstName6', 'firstName7']
Last Names: ['lastName1', 'lastName2', 'lastName3', 'lastName4', 'lastName5', 'lastName6', 'lastName7']
如何使getLists
更高效,可讀性和/或更清潔?
該演示是Python3,如果您使用Python2,請嘗試進行一些可能的代碼更改:
firstNames = ['firstName{}'.format(i) for i in range(1, 3)]
lastNames = ['lastName{}'.format(i) for i in range(1, 2)]
from itertools import product, islice
print(list(islice(product(firstNames, lastNames), 5)))
islice確保返回前5個結果,如果結果小於5,則仍然可以。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.