<｜begin▁of▁sentence｜>### Instruction:
Given a bipartite graph with node sets [0, 2] and [1, 3], and edges (0, 1), (2, 1) with weight 3, and edge (2, 3) with capacity 12, generate the edge list with and without edge data using the generate_edgelist function from NetworkX.
### Response:
import networkx as nx
from networkx.algorithms import bipartite

# Create a bipartite graph
G = nx.Graph()
G.add_nodes_from([0, 2], bipartite=0)
G.add_nodes_from([1, 3], bipartite=1)
G.add_edge(0, 1)
G.add_edge(2, 1, weight=3)
G.add_edge(2, 3, capacity=12)

# Generate edge list without data
print('Edge list without data:')
for line in bipartite.generate_edgelist(G, data=False):
    print(line)

# Generate edge list with default data (dictionary)
print('\nEdge list with default data:')
for line in bipartite.generate_edgelist(G, data=True):
    print(line)

# Generate edge list with specific data attribute
print('\nEdge list with specific data (weight):')
for line in bipartite.generate_edgelist(G, data=['weight']):
    print(line)
<|EOT|>
