Skip to main content

How to Resolve Python TypeError: "sequence item expected str instance" with join()

The TypeError: sequence item 0: expected str instance, <type> found is a common error in Python encountered when using the str.join() method. This error signifies that the iterable you're trying to join contains at least one element that is not a string.

This guide explains why this error occurs for various data types (list, float, NoneType, int, tuple, bytes) and provides clear solutions.

Understanding str.join() and the TypeError

The str.join(iterable) method concatenates the elements of an iterable (like a list, tuple, etc.) into a single string. Crucially, all elements within the iterable must be strings. If join() encounters any element that is not a string, it raises a TypeError, indicating the type it found instead.

The specific error message changes based on the type of the first non-string element encountered:

  • TypeError: sequence item 0: expected str instance, list found
  • TypeError: sequence item 0: expected str instance, float found
  • TypeError: sequence item 0: expected str instance, NoneType found
  • TypeError: sequence item 0: expected str instance, int found
  • TypeError: sequence item 0: expected str instance, tuple found
  • TypeError: sequence item 0: expected str instance, bytes found

Despite the different type names mentioned, the root cause and the primary solution remain the same.

General Solution: Converting Items to Strings

To solve this TypeError, you must ensure that every item in the iterable passed to join() is a string before the join() method is called.

Using map()

The map(str, iterable) function applies the str() constructor to each item in the iterable, converting them to strings.

my_list = [1, 2.5, 'a', None, b'byte']

# Convert all items to strings using map()
string_list = map(str, my_list)

# Now join works
result = ','.join(string_list)
print(result) # Output: 1,2.5,a,None,b'byte'

Using Generator Expressions or List Comprehensions

Alternatively, use a generator expression or list comprehension to explicitly convert each item to a string.

my_list = [1, 2.5, 'a', None, b'byte']

# Using a generator expression
result_gen = '_'.join(str(item) for item in my_list)
print(result_gen) # Output: 1_2.5_a_None_b'byte'

# Using a list comprehension
result_list_comp = ''.join([str(item) for item in my_list])
print(result_list_comp) # Output: 12.5aNoneb'byte'
  • Both approaches iterate through my_list, apply str() to each item, and then join() concatenates the resulting strings.

Handling Specific Non-String Types

While the general solution works for most types, some require specific handling depending on the desired output.

list or tuple found

If your iterable contains nested lists or tuples, simply converting them to strings might not be what you want, as it includes brackets/parentheses.

# Error Example
my_list_nested = [['a', 'b'], ('c', 1)]
try:
# ⛔️ TypeError: sequence item 0: expected str instance, list found
result = ''.join(my_list_nested)
print(result)
except TypeError as e:
print(e)

# Solution 1: Nested join (joins inner elements)
result_nested_join = ''.join(''.join(map(str, sublist)) for sublist in my_list_nested)
print(result_nested_join) # Output: ab c1

# Solution 2: Join string representations
result_str_repr = ' | '.join(str(sublist) for sublist in my_list_nested)
print(result_str_repr) # Output: ['a', 'b'] | ('c', 1)
  • Choose the nested join if you want to flatten the structure; choose string representation if you want to preserve the visual structure.

float or int found

Use the general solution (map(str, ...) or str(item) for item in ...).

# Error Example
my_list_nums = [1.1, 2, 'a', 3.0]
try:
# ⛔️ TypeError: sequence item 0: expected str instance, float found
result = ''.join(my_list_nums)
print(result)
except TypeError as e:
print(e)

# Solution
result_nums = '_'.join(str(item) for item in my_list_nums)
print(result_nums) # Output: 1.1_2_a_3.0

NoneType found

  • Option A: Convert None to "None" string: Use the general solution.
  • Option B: Filter out None values: Use filter() or a conditional in a comprehension.
# Error Example
my_list_none = [None, 'a', None, 'b']
try:
# ⛔️ TypeError: sequence item 0: expected str instance, NoneType found
result = ''.join(my_list_none)
print(result)
except TypeError as e:
print(e)

# Solution A: Convert None to "None"
result_a = ','.join(str(item) for item in my_list_none)
print(f"Solution A: {result_a}") # Output: Solution A: None,a,None,b

# Solution B: Filter out None values
result_b = ''.join(item for item in my_list_none if item is not None)
# Or using filter: result_b = ''.join(filter(None, my_list_none))
print(f"Solution B: {result_b}") # Output: Solution B: ab

bytes found

You can not directly join bytes objects with a str separator.

  • Option A: Decode bytes to strings first: Convert all bytes objects to str using .decode() before joining with a string separator.
  • Option B: Use a bytes separator: If all items are bytes, use a bytes separator (like b'') for joining.
# Error Example
my_list_bytes = [b'a', b'b', 'c'] # Mixed types
try:
# ⛔️ TypeError: sequence item 0: expected str instance, bytes found
result = ''.join(my_list_bytes)
print(result)
except TypeError as e:
print(f"Error: {e}")


# Solution A: Decode bytes to strings
result_a = ''.join(item.decode('utf-8') if isinstance(item, bytes) else item
for item in my_list_bytes)
print(f"Solution A: {result_a}") # Output: Solution A: abc

# Solution B: Use bytes separator (only if all items are bytes)
my_bytes_list = [b'a', b'b', b'c']
result_b = b' '.join(my_bytes_list)
print(f"Solution B: {result_b}") # Output: Solution B: b'a b c'
print(f"Decoded B: {result_b.decode('utf-8')}") # Output: Decoded B: a b c

Conclusion

The TypeError: sequence item expected str instance when using str.join() invariably means your iterable contains non-string elements.

  • The standard solution is to convert all elements to strings using map(str, ...), a generator expression, or a list comprehension before calling join().
  • Remember to handle specific types like nested lists/tuples, None, and bytes appropriately based on your desired output.