簡體   English   中英

如何將兩個列表的所有組合拆分N次?

[英]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.

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