7
7
Hashable ,
8
8
Iterable ,
9
9
Sequence ,
10
+ List ,
10
11
)
11
12
from functools import wraps
12
13
from sys import getsizeof
15
16
Any ,
16
17
Literal ,
17
18
cast ,
19
+ ArrayLike ,
18
20
)
19
21
import warnings
20
22
@@ -517,7 +519,7 @@ def from_arrays(
517
519
)
518
520
519
521
@classmethod
520
- @names_compat
522
+ @doc ( doc_create_index )
521
523
def from_tuples (
522
524
cls ,
523
525
tuples : Iterable [tuple [Hashable , ...]],
@@ -529,41 +531,24 @@ def from_tuples(
529
531
"""
530
532
if not is_list_like (tuples ):
531
533
raise TypeError ("Input must be a list / sequence of tuple-likes." )
532
-
533
- if is_iterator (tuples ):
534
- tuples = list (tuples )
535
-
536
- tuples = cast (Collection [tuple [Hashable , ...]], tuples )
537
-
538
- # handling the empty tuple cases
539
- if len (tuples ) and all (isinstance (e , tuple ) and not e for e in tuples ):
540
- codes = [np .zeros (len (tuples ))]
541
- levels = [Index (com .asarray_tuplesafe (tuples , dtype = np .dtype ("object" )))]
542
- return cls (
543
- levels = levels ,
544
- codes = codes ,
545
- sortorder = sortorder ,
546
- names = names ,
547
- verify_integrity = False ,
548
- )
549
534
550
- arrays : list [Sequence [Hashable ]]
551
- if len (tuples ) == 0 :
535
+ if isinstance (tuples , (list , tuple )) and len (tuples ) == 0 :
552
536
if names is None :
553
537
raise TypeError ("Cannot infer number of levels from empty list" )
554
- # error: Argument 1 to "len" has incompatible type "Hashable";
555
- # expected "Sized"
556
- arrays = [[]] * len (names ) # type: ignore[arg-type]
557
- elif isinstance (tuples , (np .ndarray , Index )):
558
- if isinstance (tuples , Index ):
559
- tuples = np .asarray (tuples ._values )
560
-
561
- arrays = list (lib .tuples_to_object_array (tuples ).T )
562
- elif isinstance (tuples , list ):
563
- arrays = list (lib .to_object_array_tuples (tuples ).T )
538
+ names_seq = cast (Sequence [Hashable ], names )
539
+ arrays : List [ArrayLike ] = [[]] * len (names_seq )
540
+ return cls .from_arrays (arrays , sortorder = sortorder , names = names )
541
+
542
+ # Convert to list and normalize
543
+ tuples_list = [t if isinstance (t , tuple ) else (t ,) for t in tuples ]
544
+ if not tuples_list :
545
+ arrays = []
564
546
else :
565
- arrs = zip (* tuples )
566
- arrays = cast (list [Sequence [Hashable ]], arrs )
547
+ max_length = max (len (t ) for t in tuples_list )
548
+ result_tuples = [
549
+ t + (np .nan ,) * (max_length - len (t )) for t in tuples_list
550
+ ]
551
+ arrays = list (lib .to_object_array_tuples (result_tuples ).T )
567
552
568
553
return cls .from_arrays (arrays , sortorder = sortorder , names = names )
569
554
0 commit comments