简体   繁体   中英

list/deque and nested for-loop

I'm new to Python and am running into a bit of a road block. I'm using python 3 and I have the following code:

from collections import deque

databases=input("Enter databases: ")

db_list = deque(databases.split())
node1list = []
node2list = []
node3list = []

numDatabases = len(db_list)

while len(db_list) > 0:
    if len(db_list) > 0:
        node1list.append(db_list.popleft())
    if len(db_list) > 0:
        node2list.append(db_list.popleft())
    if len(db_list) > 0:
        node3list.append(db_list.popleft())

print("Paste the following in Node 1's file")
print("--------------------------------------------")
print("[[INSTANCE]")
print("#  Keep a blank space after the colon character.")
print("#")
print("group1:", end="")
for db in node1list:
    print(" " + db, end="")

print("\n\nPaste the following in Node 2's file")
print("--------------------------------------------")
print("[[INSTANCE]")
print("#  Keep a blank space after the colon character.")
print("#")
print("group1: ", end="")
for db in node2list:
    print(" " + db, end="")

print("\n\nPaste the following in Node 3's file")
print("--------------------------------------------")
print("[[INSTANCE]")
print("#  Keep a blank space after the colon character.")
print("#")
print("group1: ", end="")
for db in node3list:
    print(" " + db, end="")

When I run the code, I get output like this:

Enter databases: one two three four five six seven eight nine ten eleven twelve thirteen fourteen fifteen sixteen seventeen eighteen nineteen twenty twentyone twentytwo twentythree twentyfour twentyfive twentysix twentyseven twentyeight twentynine thirty thirtyone thirtytwo thirtythree thirtyfour
----------------------------------------------------------------------------------------------

Paste the following in Node 1's file
--------------------------------------------
[[INSTANCE]
#  Keep a blank space after the colon character.
#
group1: one four seven ten thirteen sixteen nineteen twentytwo twentyfive twentyeight thirtyone thirtyfour

Paste the following in Node 2's file
--------------------------------------------
[[INSTANCE]
#  Keep a blank space after the colon character.
#
group1:  two five eight eleven fourteen seventeen twenty twentythree twentysix twentynine thirtytwo

Paste the following in Node 3's file
--------------------------------------------
[[INSTANCE]
#  Keep a blank space after the colon character.
#
group1:  three six nine twelve fifteen eighteen twentyone twentyfour twentyseven thirty thirtythree

But I need the group1 to only take a maximum of 5 databases, and then to automatically start plugging them into group2. Each group can only hold up to 5 databases. Also, the number of databases could be far more than just 34 (that number is an unknown variable), so I need the ability to keep increasing the number of groups to compensate for this unknown variable.

So I would like the output to look like this:

Enter databases: one two three four five six seven eight nine ten eleven twelve thirteen fourteen fifteen sixteen seventeen eighteen nineteen twenty twentyone twentytwo twentythree twentyfour twentyfive twentysix twentyseven twentyeight twentynine thirty thirtyone thirtytwo thirtythree thirtyfour

----------------------------------------------------------------------------------------------

Paste the following in Node 1's file
--------------------------------------------
[[INSTANCE]
#  Keep a blank space after the colon character.
#
group1: one four seven ten thirteen
group2: sixteen nineteen twentytwo twentyfive twentyeight
group3: thirtyone thirtyfour

Paste the following in Node 2's file
--------------------------------------------
[[INSTANCE]
#  Keep a blank space after the colon character.
#
group1: two five eight eleven fourteen
group2: seventeen twenty twentythree twentysix twentynine
group3: thirtytwo

Paste the following in Node 3's file
--------------------------------------------
[[INSTANCE]
#  Keep a blank space after the colon character.
#
group1: three six nine twelve fifteen
group2: eighteen twentyone twentyfour twentyseven thirty
group3: thirtythree

But I'm at a complete loss at how to do this. I think this can be achieved with a nested for-loop within my while-loop but I haven't been able to get the results I need. I'm not sure if I'm just over thinking things or maybe I just need to take a break lol. Any suggestions that can help me out?

If I understand your problem correctly this is just a simple list of items split into chunks. Using funcy :

>>> from funcy import chunks
>>> s = "one two three four five six seven eight nine ten eleven"
>>> databases = chunks(5, s.split())
>>> databases
[['one', 'two', 'three', 'four', 'five'], ['six', 'seven', 'eight', 'nine', 'ten'], ['eleven']]
>>> databases[0]
['one', 'two', 'three', 'four', 'five']
>>> databases[1]
['six', 'seven', 'eight', 'nine', 'ten']
>>> databases[2]
['eleven']
>>> len(databases[0])
5
>>> len(databases[1])
5
>>> len(databases[2])
1

Your code could then be re-written like this:

#!/usr/bin/env python


from __future__ import print_function


from funcy import chunks


s = raw_input("Enter databases: ")

nodes = chunks(5, s.split())

for i, node in enumerate(nodes):
    print("Paste the following in Node 1's file")
    print("--------------------------------------------")
    print("[[INSTANCE]")
    print("#  Keep a blank space after the colon character.")
    print("#")
    print("group{0:d}:".format(i), end="")
    for db in node:
        print(" " + db, end="")

With the following sample output:

$ python bar.py 
Enter databases: a b c d e f g h i j k l m n o p q r s t u v w x y z
Paste the following in Node 1's file
--------------------------------------------
[[INSTANCE]
#  Keep a blank space after the colon character.
#
group0: a b c d ePaste the following in Node 1's file
--------------------------------------------

and so on...

Update:

By the way you can implement chunks like this:

def chunks(l, n):
    """ Yield successive n-sized chunks from l.
    """
    for i in xrange(0, len(l), n):
        yield l[i:i+n]

Liberally borrowed from: How do you split a list into evenly sized chunks?

Instead of using any extra modules, if you want to correct the logic of your code then just change your while-loop block as follows

i = 0
node1list = [[]]
node2list = [[]]
node3list = [[]]

while len(db_list) > 0:
    if len(node1list[i]) < 5:
        node1list[i].append(db_list.pop(0))
    elif len(node2list[i]) < 5:
        node2list[i].append(db_list.pop(0))
    elif len(node3list[i]) < 5:
        node3list[i].append(db_list.pop(0))
    else:
        node1list.append([])
        if len(db_list) > 5:
            node2list.append([])
            if len(db_list) > 10:
                node3list.append([])
        i += 1

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM