

from utils import read_input
from constants import EURISTIC_FACTOR

from collections import Counter
import sys


def choose_nodes(nodes, neighbours_iterable):
    neighbours_count = len(neighbours_iterable)
    unpacked_list = []
    for t in neighbours_iterable:
        unpacked_list += t[1:]
    c = Counter(unpacked_list)

    return tuple(k for k, v in c.items() if v >= neighbours_count * EURISTIC_FACTOR and k not in set(nodes))


def main(separator='\t'):
    """
    Choose the next node to be added to the subgraph.
    Take as input:
        - iterable of nodes (ordered) as key
        - iterable of iterable as value
    """
    data = read_input(sys.stdin)
    for nodes, neighbours_iterable in data:
        nodes = eval(nodes)

        neighbours_iterable = eval(neighbours_iterable)
        next_nodes = choose_nodes(nodes, neighbours_iterable)

        for n in next_nodes:
            print("{}\t{}".format(sorted(nodes + (n, )), neighbours_iterable))

if __name__ == '__main__':
    main()



from utils import read_input
from constants import EURISTIC_FACTOR

from collections import Counter
import sys


def choose_nodes(nodes, neighbours_iterable):
    neighbours_count = len(neighbours_iterable)
    unpacked_list = []
    for t in neighbours_iterable:
        unpacked_list += t[1:]
    c = Counter(unpacked_list)

    nodes_set = set(nodes)

    return tuple(k for k, v in c.items() if v >= neighbours_count * EURISTIC_FACTOR and k not in nodes_set)


def main(separator='\t'):
    """
    Choose the next node to be added to the subgraph.
    Take as input:
        - iterable of nodes (ordered) as key
        - iterable of iterable as value
    """
    data = read_input(sys.stdin)
    for nodes, neighbours_iterable in data:
        nodes = eval(nodes)

        neighbours_iterable = eval(neighbours_iterable)
        next_nodes = choose_nodes(nodes, neighbours_iterable)

        for n in next_nodes:
            print("{}\t{}".format(sorted(nodes + (n, )), neighbours_iterable))

if __name__ == '__main__':
    main()

Improve choose_nodes method (set problem)
Improve choose_nodes method (set problem)

  
  
  from utils import read_input
  from constants import EURISTIC_FACTOR
  
  from collections import Counter
  import sys
  
  
  def choose_nodes(nodes, neighbours_iterable):
      neighbours_count = len(neighbours_iterable)
      unpacked_list = []
      for t in neighbours_iterable:
          unpacked_list += t[1:]
      c = Counter(unpacked_list)
  
+     nodes_set = set(nodes)
+ 
-     return tuple(k for k, v in c.items() if v >= neighbours_count * EURISTIC_FACTOR and k not in set(nodes))
+     return tuple(k for k, v in c.items() if v >= neighbours_count * EURISTIC_FACTOR and k not in nodes_set)
  
  
  def main(separator='\t'):
      """
      Choose the next node to be added to the subgraph.
      Take as input:
          - iterable of nodes (ordered) as key
          - iterable of iterable as value
      """
      data = read_input(sys.stdin)
      for nodes, neighbours_iterable in data:
          nodes = eval(nodes)
  
          neighbours_iterable = eval(neighbours_iterable)
          next_nodes = choose_nodes(nodes, neighbours_iterable)
  
          for n in next_nodes:
              print("{}\t{}".format(sorted(nodes + (n, )), neighbours_iterable))
  
  if __name__ == '__main__':
      main()
  
Improve choose_nodes method (set problem)
## Code Before:


from utils import read_input
from constants import EURISTIC_FACTOR

from collections import Counter
import sys


def choose_nodes(nodes, neighbours_iterable):
    neighbours_count = len(neighbours_iterable)
    unpacked_list = []
    for t in neighbours_iterable:
        unpacked_list += t[1:]
    c = Counter(unpacked_list)

    return tuple(k for k, v in c.items() if v >= neighbours_count * EURISTIC_FACTOR and k not in set(nodes))


def main(separator='\t'):
    """
    Choose the next node to be added to the subgraph.
    Take as input:
        - iterable of nodes (ordered) as key
        - iterable of iterable as value
    """
    data = read_input(sys.stdin)
    for nodes, neighbours_iterable in data:
        nodes = eval(nodes)

        neighbours_iterable = eval(neighbours_iterable)
        next_nodes = choose_nodes(nodes, neighbours_iterable)

        for n in next_nodes:
            print("{}\t{}".format(sorted(nodes + (n, )), neighbours_iterable))

if __name__ == '__main__':
    main()

## Instruction:
Improve choose_nodes method (set problem)
## Code After:


from utils import read_input
from constants import EURISTIC_FACTOR

from collections import Counter
import sys


def choose_nodes(nodes, neighbours_iterable):
    neighbours_count = len(neighbours_iterable)
    unpacked_list = []
    for t in neighbours_iterable:
        unpacked_list += t[1:]
    c = Counter(unpacked_list)

    nodes_set = set(nodes)

    return tuple(k for k, v in c.items() if v >= neighbours_count * EURISTIC_FACTOR and k not in nodes_set)


def main(separator='\t'):
    """
    Choose the next node to be added to the subgraph.
    Take as input:
        - iterable of nodes (ordered) as key
        - iterable of iterable as value
    """
    data = read_input(sys.stdin)
    for nodes, neighbours_iterable in data:
        nodes = eval(nodes)

        neighbours_iterable = eval(neighbours_iterable)
        next_nodes = choose_nodes(nodes, neighbours_iterable)

        for n in next_nodes:
            print("{}\t{}".format(sorted(nodes + (n, )), neighbours_iterable))

if __name__ == '__main__':
    main()
