Is it indeed the case that to access edge attributes in networkx the awkward third form below is necessary and no variation of the more svelte first two forms will do?
In NetworkX 2.4 you can also use graph.edges.data().
So in this case:
import networkx as nx
G = nx.Graph()
G.add_edge(1, 2, weight=4.7)
G.add_edge(3, 4, weight=5.8)
for node1, node2, data in G.edges.data():
print(data['weight'])